Last active
October 13, 2019 13:34
-
-
Save gingerBill/809f008ab1afe1b5463c4ec8b89c5362 to your computer and use it in GitHub Desktop.
Odin package glfw
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package glfw | |
| import "core:fmt" | |
| import "core:math" | |
| import "core:mem" | |
| when ODIN_OS == "linux" do foreign import glfw "system:glfw"; | |
| when ODIN_OS == "darwin" do foreign import glfw { | |
| "macos/libglfw3.a", | |
| "system:Cocoa.framework", | |
| "system:OpenGL.framework", | |
| "system:IOKit.framework", | |
| "system:CoreVideo.framework", | |
| }; | |
| when ODIN_OS == "windows" do foreign import glfw "glfw3dll.lib"; | |
| /*** Structs/types ***/ | |
| Window :: opaque rawptr; | |
| Monitor :: opaque rawptr; | |
| Cursor :: opaque rawptr; | |
| VidMode :: struct { | |
| width: i32, | |
| height: i32, | |
| red_bits: i32, | |
| green_bits: i32, | |
| blue_bits: i32, | |
| refresh_rate: i32, | |
| }; | |
| GammaRamp :: struct { | |
| red, green, blue: ^u16, | |
| size: u32, | |
| }; | |
| Image :: struct { | |
| width, height: i32, | |
| pixels: ^u8, | |
| }; | |
| /*** Procedure type declarations ***/ | |
| WindowIconifyProc :: #type proc "c" (window: Window, iconified: b32); | |
| WindowRefreshProc :: #type proc "c" (window: Window); | |
| WindowFocusProc :: #type proc "c" (window: Window, focused: b32); | |
| WindowCloseProc :: #type proc "c" (window: Window); | |
| WindowSizeProc :: #type proc "c" (window: Window, width, height: i32); | |
| WindowPosProc :: #type proc "c" (window: Window, xpos, ypos: i32); | |
| FramebufferSizeProc :: #type proc "c" (window: Window, width, height: i32); | |
| DropProc :: #type proc "c" (window: Window, count: i32, paths: ^cstring); | |
| MonitorProc :: #type proc "c" (window: Window); | |
| KeyProc :: #type proc "c" (window: Window, key, scancode, action: i32, mods: ModifierSet); | |
| MouseButtonProc :: #type proc "c" (window: Window, button, action: i32, mods: ModifierSet); | |
| CursorPosProc :: #type proc "c" (window: Window, xpos, ypos: f64); | |
| ScrollProc :: #type proc "c" (window: Window, xoffset, yoffset: f64); | |
| CharProc :: #type proc "c" (window: Window, codepoint: rune); | |
| CharModsProc :: #type proc "c" (window: Window, codepoint: rune, mods: i32); | |
| CursorEnterProc :: #type proc "c" (window: Window, entered: b32); | |
| JoystickProc :: #type proc "c" (joy, event: i32); | |
| ErrorProc :: #type proc "c" (error: i32, description: cstring); | |
| /*** Functions ***/ | |
| @(default_calling_convention="c") | |
| @(link_prefix="glfw") | |
| foreign glfw { | |
| Init :: proc() -> b32 --- | |
| Terminate :: proc() --- | |
| GetPrimaryMonitor :: proc() -> Monitor --- | |
| GetVideoMode :: proc(monitor: Monitor) -> ^VidMode --- | |
| SetGamma :: proc(monitor: Monitor, gamma: f32) --- | |
| GetGammaRamp :: proc(monitor: Monitor) -> ^GammaRamp --- | |
| SetGammaRamp :: proc(monitor: Monitor, ramp: ^GammaRamp) --- | |
| DestroyWindow :: proc(window: Window) --- | |
| WindowHint :: proc(hint, value: i32) --- | |
| DefaultWindowHints :: proc() --- | |
| WindowShouldClose :: proc(window: Window) -> b32 --- | |
| SetWindowShouldClose :: proc(window: Window, value: b32) --- | |
| SwapInterval :: proc(interval: b32) --- | |
| SwapBuffers :: proc(window: Window) --- | |
| SetWindowIcon :: proc(window: Window, count: i32, images: ^Image) --- | |
| SetWindowPos :: proc(window: Window, xpos, ypos: i32) --- | |
| SetWindowSizeLimits :: proc(window: Window, minwidth, minheight, maxwidth, maxheight: i32) --- | |
| SetWindowAspectRatio :: proc(window: Window, numer, denom: i32) --- | |
| SetWindowSize :: proc(window: Window, width, height: i32) --- | |
| IconifyWindow :: proc(window: Window) --- | |
| RestoreWindow :: proc(window: Window) --- | |
| MaximizeWindow :: proc(window: Window) --- | |
| ShowWindow :: proc(window: Window) --- | |
| HideWindow :: proc(window: Window) --- | |
| FocusWindow :: proc(window: Window) --- | |
| GetWindowMonitor :: proc(window: Window) --- | |
| SetWindowMonitor :: proc(window: Window, monitor: Monitor, xpos, ypos, width, height, refresh_rate: i32) --- | |
| GetWindowAttrib :: proc(window: Window, attrib: i32) -> i32 --- | |
| SetWindowUserPointer :: proc(window: Window, pointer: rawptr) --- | |
| GetWindowUserPointer :: proc(window: Window) -> rawptr --- | |
| PollEvents :: proc() --- | |
| WaitEvents :: proc() --- | |
| WaitEventsTimeout :: proc(timeout: f64) --- | |
| PostEmptyEvent :: proc() --- | |
| GetInputMode :: proc(window: Window, mode: i32) -> i32 --- | |
| SetInputMode :: proc(window: Window, mode, value: i32) --- | |
| GetMouseButton :: proc(window: Window, button: i32) -> b32 --- | |
| SetCursorPos :: proc(window: Window, xpos, ypos: f64) --- | |
| CreateCursor :: proc(image: ^Image, xhot, yhot: i32) -> Cursor --- | |
| DestroyCursor :: proc(cursor: Cursor) --- | |
| SetCursor :: proc(window: Window, cursor: Cursor) --- | |
| CreateStandardCursor :: proc(shape: i32) -> Cursor --- | |
| SetClipboardString :: proc(window: Window, str: cstring) --- | |
| GetTime :: proc() -> f64 --- | |
| SetTime :: proc(time: f64) --- | |
| GetTimerValue :: proc() -> u64 --- | |
| GetTimerFrequency :: proc() -> u64 --- | |
| MakeContextCurrent :: proc(window: Window) --- | |
| GetCurrentContext :: proc() -> Window --- | |
| GetProcAddress :: proc(name: cstring) -> rawptr --- | |
| ExtensionSupported :: proc(extension: cstring) -> b32 --- | |
| SetWindowIconifyCallback :: proc(window: Window, cbfun: WindowIconifyProc) -> WindowIconifyProc --- | |
| SetWindowRefreshCallback :: proc(window: Window, cbfun: WindowRefreshProc) -> WindowRefreshProc --- | |
| SetWindowFocusCallback :: proc(window: Window, cbfun: WindowFocusProc) -> WindowFocusProc --- | |
| SetWindowCloseCallback :: proc(window: Window, cbfun: WindowCloseProc) -> WindowCloseProc --- | |
| SetWindowSizeCallback :: proc(window: Window, cbfun: WindowSizeProc) -> WindowSizeProc --- | |
| SetWindowPosCallback :: proc(window: Window, cbfun: WindowPosProc) -> WindowPosProc --- | |
| SetFramebufferSizeCallback :: proc(window: Window, cbfun: FramebufferSizeProc) -> FramebufferSizeProc --- | |
| SetDropCallback :: proc(window: Window, cbfun: DropProc) -> DropProc --- | |
| SetMonitorCallback :: proc(window: Window, cbfun: MonitorProc) -> MonitorProc --- | |
| SetKeyCallback :: proc(window: Window, cbfun: KeyProc) -> KeyProc --- | |
| SetMouseButtonCallback :: proc(window: Window, cbfun: MouseButtonProc) -> MouseButtonProc --- | |
| SetCursorPosCallback :: proc(window: Window, cbfun: CursorPosProc) -> CursorPosProc --- | |
| SetScrollCallback :: proc(window: Window, cbfun: ScrollProc) -> ScrollProc --- | |
| SetCharCallback :: proc(window: Window, cbfun: CharProc) -> CharProc --- | |
| SetCharModsCallback :: proc(window: Window, cbfun: CharModsProc) -> CharModsProc --- | |
| SetCursorEnterCallback :: proc(window: Window, cbfun: CursorEnterProc) -> CursorEnterProc --- | |
| SetJoystickCallback :: proc(window: Window, cbfun: JoystickProc) -> JoystickProc --- | |
| SetErrorCallback :: proc(cbfun: ErrorProc) -> ErrorProc --- | |
| GetKey :: proc(window: Window, key: i32) -> b32 --- | |
| JoystickPresent :: proc(joy: i32) -> b32 --- | |
| VulkanSupported :: proc() -> b32 --- | |
| } | |
| // Odin Wrappers | |
| GetVersion :: proc() -> (major, minor, rev: i32) { | |
| foreign glfw { | |
| glfwGetVersion :: proc "c" (major, minor, rev: ^i32) --- | |
| } | |
| glfwGetVersion(&major, &minor, &rev); | |
| return major, minor, rev; | |
| } | |
| GetVersionString :: proc() -> string { | |
| foreign glfw { | |
| glfwGetVersionString :: proc "c" () -> cstring --- | |
| } | |
| return string(glfwGetVersionString()); | |
| } | |
| GetMonitors :: proc() -> []Monitor { | |
| foreign glfw { | |
| glfwGetMonitors :: proc "c" (count: ^i32) -> ^Monitor --- | |
| } | |
| count: i32; | |
| data := glfwGetMonitors(&count); | |
| return mem.slice_ptr(data, int(count)); | |
| } | |
| GetMonitorPos :: proc(monitor: Monitor) -> (xpos, ypos: i32) { | |
| foreign glfw { | |
| glfwGetMonitorPos :: proc "c" (monitor: Monitor, xpos, ypos: ^i32) --- | |
| } | |
| glfwGetMonitorPos(monitor, &xpos, &ypos); | |
| return xpos, ypos; | |
| } | |
| GetMonitorPhysicalSize :: proc(monitor: Monitor) -> (widthMM, heightMM: i32) { | |
| foreign glfw { | |
| glfwGetMonitorPhysicalSize :: proc "c" (monitor: Monitor, widthMM, heightMM: ^i32) --- | |
| } | |
| glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM); | |
| return widthMM, heightMM; | |
| } | |
| GetMonitorName :: proc(monitor: Monitor) -> string { | |
| foreign glfw { | |
| glfwGetMonitorName :: proc "c" (monitor: Monitor) -> cstring --- | |
| } | |
| return string(glfwGetMonitorName(monitor)); | |
| } | |
| CreateWindow :: inline proc(width, height: i32, title: string, monitor: Monitor = nil, share: Window = nil) -> Window { | |
| foreign glfw { | |
| glfwCreateWindow :: proc "c" (width, height: i32, title: cstring, monitor: Monitor, share: Window) -> Window --- | |
| } | |
| title := fmt.tprint(title, "\x00"); | |
| ctitle := cstring(&title[0]); | |
| return glfwCreateWindow(width, height, ctitle, monitor, share); | |
| } | |
| GetClipboardString :: proc(window: Window) -> string { | |
| foreign glfw { | |
| glfwGetClipboardString :: proc "c" (window: Window) -> cstring --- | |
| } | |
| return string(glfwGetClipboardString(window)); | |
| } | |
| GetVideoModes :: proc(monitor: Monitor) -> []VidMode { | |
| foreign glfw { | |
| glfwGetVideoModes :: proc "c" (monitor: Monitor, count: ^i32) -> ^VidMode --- | |
| } | |
| count: i32; | |
| data := glfwGetVideoModes(monitor, &count); | |
| return mem.slice_ptr(data, int(count)); | |
| } | |
| GetCurrentMonitor :: proc(window: Window) -> Monitor { | |
| wx, wy := GetWindowPos(window); | |
| ww, wh := GetWindowSize(window); | |
| monitors := GetMonitors(); | |
| best_overlap: i32 = 0; | |
| best_monitor: Monitor; | |
| for monitor in monitors { | |
| mode := GetVideoMode(monitor); | |
| mx, my := GetMonitorPos(monitor); | |
| mw, mh := mode.width, mode.height; | |
| overlap := max(0, min(wx + ww, mx + mw) - max(wx, mx)) * | |
| max(0, min(wy + wh, my + mh) - max(wy, my)); | |
| if (best_overlap < overlap) { | |
| best_overlap = overlap; | |
| best_monitor = monitor; | |
| } | |
| } | |
| return best_monitor; | |
| } | |
| GetKeyName :: proc(key, scancode: i32) -> string { | |
| foreign glfw { | |
| glfwGetKeyName :: proc "c" (key, scancode: i32) -> cstring --- | |
| } | |
| return string(glfwGetKeyName(key, scancode)); | |
| } | |
| GetCursorPos :: proc(window: Window) -> (xpos, ypos: f64) { | |
| foreign glfw { | |
| glfwGetCursorPos :: proc "c" (window: Window, xpos, ypos: ^f64) --- | |
| } | |
| glfwGetCursorPos(window, &xpos, &ypos); | |
| return xpos, ypos; | |
| } | |
| SetWindowTitle :: proc(window: Window, fmt_string: string, args: ..any) { | |
| foreign glfw { | |
| glfwSetWindowTitle :: proc "c" (window: Window, title: cstring) --- | |
| } | |
| title := fmt.tprintf(fmt_string, ..args); | |
| if len(title) > 0 { | |
| glfwSetWindowTitle(window, cstring(&title[0])); | |
| } else { | |
| glfwSetWindowTitle(window, ""); | |
| } | |
| } | |
| GetWindowPos :: proc(window: Window) -> (xpos, ypos: i32) { | |
| foreign glfw { | |
| glfwGetWindowPos :: proc "c" (window: Window, xpos, ypos: ^i32) --- | |
| } | |
| glfwGetWindowPos(window, &xpos, &ypos); | |
| return xpos, ypos; | |
| } | |
| GetWindowSize :: proc(window: Window) -> (width, height: i32) { | |
| foreign glfw { | |
| glfwGetWindowSize :: proc "c" (window: Window, width, height: ^i32) --- | |
| } | |
| glfwGetWindowSize(window, &width, &height); | |
| return width, height; | |
| } | |
| GetFramebufferSize :: proc(window: Window) -> (width, height: i32) { | |
| foreign glfw { | |
| glfwGetFramebufferSize :: proc "c" (window: Window, width, height: ^i32) --- | |
| } | |
| glfwGetFramebufferSize(window, &width, &height); | |
| return width, height; | |
| } | |
| GetWindowFrameSize :: proc(window: Window) -> (left, top, right, bottom: i32) { | |
| foreign glfw { | |
| glfwGetWindowFrameSize :: proc "c" (window: Window, left, top, right, bottom: ^i32) --- | |
| } | |
| glfwGetWindowFrameSize(window, &left, &top, &right, &bottom); | |
| return left, top, right, bottom; | |
| } | |
| GetJoystickAxes :: proc(joy: i32) -> []f32 { | |
| foreign glfw { | |
| glfwGetJoystickAxes :: proc "c" (joy: i32, count: ^i32) -> ^f32 --- | |
| } | |
| count: i32; | |
| data := glfwGetJoystickAxes(joy, &count); | |
| return mem.slice_ptr(data, int(count)); | |
| } | |
| GetJoystickButtons :: proc(joy: i32) -> []u8 { | |
| foreign glfw { | |
| glfwGetJoystickButtons :: proc "c" (joy: i32, count: ^i32) -> ^u8 --- | |
| } | |
| count: i32; | |
| data := glfwGetJoystickButtons(joy, &count); | |
| return mem.slice_ptr(data, int(count)); | |
| } | |
| GetJoystickName :: proc(joy: i32) -> string { | |
| foreign glfw { | |
| glfwGetJoystickName :: proc "c" (joy: i32) -> cstring --- | |
| } | |
| return string(glfwGetJoystickName(joy)); | |
| } | |
| GetRequiredInstanceExtensions :: proc() -> []cstring { | |
| foreign glfw { | |
| glfwGetRequiredInstanceExtensions :: proc "c" (count: ^u32) -> ^cstring --- | |
| } | |
| count: u32; | |
| data := glfwGetRequiredInstanceExtensions(&count); | |
| return mem.slice_ptr(data, int(count)); | |
| } | |
| calculate_frame_timings :: proc(window: Window, title_prefix: string) { | |
| @static persistent_timing_data := struct { | |
| t1, avg_dt, avg_dt2, last_frame_time: f64, | |
| num_samples, counter: int, | |
| }{0.0, 0.0, 0.0, 1.0/60, 60, 0}; | |
| using persistent_timing_data; | |
| t2 := GetTime(); | |
| dt := t2-t1; | |
| t1 = t2; | |
| avg_dt += dt; | |
| avg_dt2 += dt*dt; | |
| counter += 1; | |
| last_frame_time = dt; | |
| if counter == num_samples { | |
| avg_dt /= f64(num_samples); | |
| avg_dt2 /= f64(num_samples); | |
| std_dt := math.sqrt(avg_dt2 - avg_dt*avg_dt); | |
| ste_dt := std_dt/math.sqrt(f64(num_samples)); | |
| // if title_prefix != "" { | |
| // SetWindowTitle(window, "%s - frame timings: avg = %.3fms, std = %.3fms, ste = %.4fms. fps = %.1f\x00", title_prefix, 1e3*avg_dt, 1e3*std_dt, 1e3*ste_dt, 1.0/avg_dt); | |
| // } else { | |
| // SetWindowTitle(window, "frame timings: avg = %.3fms, std = %.3fms, ste = %.4fms. fps = %.1f\x00", 1e3*avg_dt, 1e3*std_dt, 1e3*ste_dt, 1.0/avg_dt); | |
| // } | |
| num_samples = int(1.0/avg_dt); | |
| avg_dt = 0.0; | |
| avg_dt2 = 0.0; | |
| counter = 0; | |
| } | |
| } | |
| set_proc_address :: proc(p: rawptr, name: cstring) { | |
| foreign glfw { | |
| glfwGetProcAddress :: proc "c" (name: cstring) -> rawptr --- | |
| } | |
| (^rawptr)(p)^ = GetProcAddress(name); | |
| } | |
| /*** Constants ***/ | |
| /* Versions */ | |
| VERSION_MAJOR :: 3; | |
| VERSION_MINOR :: 2; | |
| VERSION_REVISION :: 1; | |
| /* Button/Key states */ | |
| RELEASE :: 0; | |
| PRESS :: 1; | |
| REPEAT :: 2; | |
| /* The unknown key */ | |
| KEY_UNKNOWN :: -1; | |
| /** Printable keys **/ | |
| /* Named printable keys */ | |
| KEY_SPACE :: 32; | |
| KEY_APOSTROPHE :: 39; /* ' */ | |
| KEY_COMMA :: 44; /* , */ | |
| KEY_MINUS :: 45; /* - */ | |
| KEY_PERIOD :: 46; /* . */ | |
| KEY_SLASH :: 47; /* / */ | |
| KEY_SEMICOLON :: 59; /* ; */ | |
| KEY_EQUAL :: 61; /* = */ | |
| KEY_LEFT_BRACKET :: 91; /* [ */ | |
| KEY_BACKSLASH :: 92; /* \ */ | |
| KEY_RIGHT_BRACKET :: 93; /* ] */ | |
| KEY_GRAVE_ACCENT :: 96; /* ` */ | |
| KEY_WORLD_1 :: 161; /* non-US #1 */ | |
| KEY_WORLD_2 :: 162; /* non-US #2 */ | |
| /* Alphanumeric characters */ | |
| KEY_0 :: 48; | |
| KEY_1 :: 49; | |
| KEY_2 :: 50; | |
| KEY_3 :: 51; | |
| KEY_4 :: 52; | |
| KEY_5 :: 53; | |
| KEY_6 :: 54; | |
| KEY_7 :: 55; | |
| KEY_8 :: 56; | |
| KEY_9 :: 57; | |
| KEY_A :: 65; | |
| KEY_B :: 66; | |
| KEY_C :: 67; | |
| KEY_D :: 68; | |
| KEY_E :: 69; | |
| KEY_F :: 70; | |
| KEY_G :: 71; | |
| KEY_H :: 72; | |
| KEY_I :: 73; | |
| KEY_J :: 74; | |
| KEY_K :: 75; | |
| KEY_L :: 76; | |
| KEY_M :: 77; | |
| KEY_N :: 78; | |
| KEY_O :: 79; | |
| KEY_P :: 80; | |
| KEY_Q :: 81; | |
| KEY_R :: 82; | |
| KEY_S :: 83; | |
| KEY_T :: 84; | |
| KEY_U :: 85; | |
| KEY_V :: 86; | |
| KEY_W :: 87; | |
| KEY_X :: 88; | |
| KEY_Y :: 89; | |
| KEY_Z :: 90; | |
| /** Function keys **/ | |
| /* Named non-printable keys */ | |
| KEY_ESCAPE :: 256; | |
| KEY_ENTER :: 257; | |
| KEY_TAB :: 258; | |
| KEY_BACKSPACE :: 259; | |
| KEY_INSERT :: 260; | |
| KEY_DELETE :: 261; | |
| KEY_RIGHT :: 262; | |
| KEY_LEFT :: 263; | |
| KEY_DOWN :: 264; | |
| KEY_UP :: 265; | |
| KEY_PAGE_UP :: 266; | |
| KEY_PAGE_DOWN :: 267; | |
| KEY_HOME :: 268; | |
| KEY_END :: 269; | |
| KEY_CAPS_LOCK :: 280; | |
| KEY_SCROLL_LOCK :: 281; | |
| KEY_NUM_LOCK :: 282; | |
| KEY_PRINT_SCREEN :: 283; | |
| KEY_PAUSE :: 284; | |
| /* Function keys */ | |
| KEY_F1 :: 290; | |
| KEY_F2 :: 291; | |
| KEY_F3 :: 292; | |
| KEY_F4 :: 293; | |
| KEY_F5 :: 294; | |
| KEY_F6 :: 295; | |
| KEY_F7 :: 296; | |
| KEY_F8 :: 297; | |
| KEY_F9 :: 298; | |
| KEY_F10 :: 299; | |
| KEY_F11 :: 300; | |
| KEY_F12 :: 301; | |
| KEY_F13 :: 302; | |
| KEY_F14 :: 303; | |
| KEY_F15 :: 304; | |
| KEY_F16 :: 305; | |
| KEY_F17 :: 306; | |
| KEY_F18 :: 307; | |
| KEY_F19 :: 308; | |
| KEY_F20 :: 309; | |
| KEY_F21 :: 310; | |
| KEY_F22 :: 311; | |
| KEY_F23 :: 312; | |
| KEY_F24 :: 313; | |
| KEY_F25 :: 314; | |
| /* Keypad numbers */ | |
| KEY_KP_0 :: 320; | |
| KEY_KP_1 :: 321; | |
| KEY_KP_2 :: 322; | |
| KEY_KP_3 :: 323; | |
| KEY_KP_4 :: 324; | |
| KEY_KP_5 :: 325; | |
| KEY_KP_6 :: 326; | |
| KEY_KP_7 :: 327; | |
| KEY_KP_8 :: 328; | |
| KEY_KP_9 :: 329; | |
| /* Keypad named function keys */ | |
| KEY_KP_DECIMAL :: 330; | |
| KEY_KP_DIVIDE :: 331; | |
| KEY_KP_MULTIPLY :: 332; | |
| KEY_KP_SUBTRACT :: 333; | |
| KEY_KP_ADD :: 334; | |
| KEY_KP_ENTER :: 335; | |
| KEY_KP_EQUAL :: 336; | |
| /* Modifier keys */ | |
| KEY_LEFT_SHIFT :: 340; | |
| KEY_LEFT_CONTROL :: 341; | |
| KEY_LEFT_ALT :: 342; | |
| KEY_LEFT_SUPER :: 343; | |
| KEY_RIGHT_SHIFT :: 344; | |
| KEY_RIGHT_CONTROL :: 345; | |
| KEY_RIGHT_ALT :: 346; | |
| KEY_RIGHT_SUPER :: 347; | |
| KEY_MENU :: 348; | |
| KEY_LAST :: KEY_MENU; | |
| /* Bitmask for modifier keys */ | |
| Modifier :: enum i16 { | |
| Shift = 0, | |
| Control = 1, | |
| Alt = 2, | |
| Super = 3, | |
| } | |
| ModifierSet :: bit_set[Modifier; i32]; | |
| /* Mouse buttons */ | |
| MOUSE_BUTTON_1 :: 0; | |
| MOUSE_BUTTON_2 :: 1; | |
| MOUSE_BUTTON_3 :: 2; | |
| MOUSE_BUTTON_4 :: 3; | |
| MOUSE_BUTTON_5 :: 4; | |
| MOUSE_BUTTON_6 :: 5; | |
| MOUSE_BUTTON_7 :: 6; | |
| MOUSE_BUTTON_8 :: 7; | |
| /* Mousebutton aliases */ | |
| MOUSE_BUTTON_LAST :: MOUSE_BUTTON_8; | |
| MOUSE_BUTTON_LEFT :: MOUSE_BUTTON_1; | |
| MOUSE_BUTTON_RIGHT :: MOUSE_BUTTON_2; | |
| MOUSE_BUTTON_MIDDLE :: MOUSE_BUTTON_3; | |
| /* Joystick buttons */ | |
| JOYSTICK_1 :: 0; | |
| JOYSTICK_2 :: 1; | |
| JOYSTICK_3 :: 2; | |
| JOYSTICK_4 :: 3; | |
| JOYSTICK_5 :: 4; | |
| JOYSTICK_6 :: 5; | |
| JOYSTICK_7 :: 6; | |
| JOYSTICK_8 :: 7; | |
| JOYSTICK_9 :: 8; | |
| JOYSTICK_10 :: 9; | |
| JOYSTICK_11 :: 10; | |
| JOYSTICK_12 :: 11; | |
| JOYSTICK_13 :: 12; | |
| JOYSTICK_14 :: 13; | |
| JOYSTICK_15 :: 14; | |
| JOYSTICK_16 :: 15; | |
| JOYSTICK_LAST :: JOYSTICK_16; | |
| /* Error constants */ | |
| NOT_INITIALIZED :: 0x00010001; | |
| NO_CURRENT_CONTEXT :: 0x00010002; | |
| INVALID_ENUM :: 0x00010003; | |
| INVALID_VALUE :: 0x00010004; | |
| OUT_OF_MEMORY :: 0x00010005; | |
| API_UNAVAILABLE :: 0x00010006; | |
| VERSION_UNAVAILABLE :: 0x00010007; | |
| PLATFORM_ERROR :: 0x00010008; | |
| FORMAT_UNAVAILABLE :: 0x00010009; | |
| NO_WINDOW_CONTEXT :: 0x0001000A; | |
| /* Window attributes */ | |
| FOCUSED :: 0x00020001; | |
| ICONIFIED :: 0x00020002; | |
| RESIZABLE :: 0x00020003; | |
| VISIBLE :: 0x00020004; | |
| DECORATED :: 0x00020005; | |
| AUTO_ICONIFY :: 0x00020006; | |
| FLOATING :: 0x00020007; | |
| MAXIMIZED :: 0x00020008; | |
| /* Pixel window attributes */ | |
| RED_BITS :: 0x00021001; | |
| GREEN_BITS :: 0x00021002; | |
| BLUE_BITS :: 0x00021003; | |
| ALPHA_BITS :: 0x00021004; | |
| DEPTH_BITS :: 0x00021005; | |
| STENCIL_BITS :: 0x00021006; | |
| ACCUM_RED_BITS :: 0x00021007; | |
| ACCUM_GREEN_BITS :: 0x00021008; | |
| ACCUM_BLUE_BITS :: 0x00021009; | |
| ACCUM_ALPHA_BITS :: 0x0002100A; | |
| AUX_BUFFERS :: 0x0002100B; | |
| STEREO :: 0x0002100C; | |
| SAMPLES :: 0x0002100D; | |
| SRGB_CAPABLE :: 0x0002100E; | |
| REFRESH_RATE :: 0x0002100F; | |
| DOUBLEBUFFER :: 0x00021010; | |
| /* Context window attributes */ | |
| CLIENT_API :: 0x00022001; | |
| CONTEXT_VERSION_MAJOR :: 0x00022002; | |
| CONTEXT_VERSION_MINOR :: 0x00022003; | |
| CONTEXT_REVISION :: 0x00022004; | |
| CONTEXT_ROBUSTNESS :: 0x00022005; | |
| OPENGL_FORWARD_COMPAT :: 0x00022006; | |
| OPENGL_DEBUG_CONTEXT :: 0x00022007; | |
| OPENGL_PROFILE :: 0x00022008; | |
| CONTEXT_RELEASE_BEHAVIOR :: 0x00022009; | |
| CONTEXT_NO_ERROR :: 0x0002200A; | |
| CONTEXT_CREATION_API :: 0x0002200B; | |
| /* APIs */ | |
| NO_API :: 0; | |
| OPENGL_API :: 0x00030001; | |
| OPENGL_ES_API :: 0x00030002; | |
| /* Robustness? */ | |
| NO_ROBUSTNESS :: 0; | |
| NO_RESET_NOTIFICATION :: 0x00031001; | |
| LOSE_CONTEXT_ON_RESET :: 0x00031002; | |
| /* OpenGL Profiles */ | |
| OPENGL_ANY_PROFILE :: 0; | |
| OPENGL_CORE_PROFILE :: 0x00032001; | |
| OPENGL_COMPAT_PROFILE :: 0x00032002; | |
| /* Cursor draw state and whether keys are sticky */ | |
| CURSOR :: 0x00033001; | |
| STICKY_KEYS :: 0x00033002; | |
| STICKY_MOUSE_BUTTONS :: 0x00033003; | |
| /* Cursor draw state */ | |
| CURSOR_NORMAL :: 0x00034001; | |
| CURSOR_HIDDEN :: 0x00034002; | |
| CURSOR_DISABLED :: 0x00034003; | |
| /* Behavior? */ | |
| ANY_RELEASE_BEHAVIOR :: 0; | |
| RELEASE_BEHAVIOR_FLUSH :: 0x00035001; | |
| RELEASE_BEHAVIOR_NONE :: 0x00035002; | |
| /* Context API ? */ | |
| NATIVE_CONTEXT_API :: 0x00036001; | |
| EGL_CONTEXT_API :: 0x00036002; | |
| /* Types of cursors */ | |
| ARROW_CURSOR :: 0x00036001; | |
| IBEAM_CURSOR :: 0x00036002; | |
| CROSSHAIR_CURSOR :: 0x00036003; | |
| HAND_CURSOR :: 0x00036004; | |
| HRESIZE_CURSOR :: 0x00036005; | |
| VRESIZE_CURSOR :: 0x00036006; | |
| /* Joystick? */ | |
| CONNECTED :: 0x00040001; | |
| DISCONNECTED :: 0x00040002; | |
| /* */ | |
| DONT_CARE :: -1; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package glfw | |
| import "core:sys/win32" | |
| when ODIN_OS == "windows" do foreign import glfw "glfw3dll.lib"; | |
| @(default_calling_convention="c") | |
| foreign glfw { | |
| @(link_name="glfwGetWGLContext") GetWGLContext :: proc(window: Window) -> win32.Hglrc --- | |
| @(link_name="glfwGetWin32Window") GetWin32Window :: proc(window: Window) -> win32.Hwnd --- | |
| @(link_name="glfwGetWin32Monitor") GetWin32Monitor :: proc(window: Window) -> cstring --- | |
| @(link_name="glfwGetWin32Adapter") GetWin32Adapter :: proc(window: Window) -> cstring --- | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment