package window import "core:fmt" Window :: struct { title: string, width, height: u16, backend: Backend_Info, } Event :: union { Event_Quit, Event_Key, Event_Resize, } Event_Quit :: struct {} Event_Key_State :: enum { Down, Up, } Virtual_Key :: enum { Unknown, Number_0, Number_1, Number_2, Number_3, Number_4, Number_5, Number_6, Number_7, Number_8, Number_9, Letter_A, Letter_B, Letter_C, Letter_D, Letter_E, Letter_F, Letter_G, Letter_H, Letter_I, Letter_J, Letter_K, Letter_L, Letter_M, Letter_N, Letter_O, Letter_P, Letter_Q, Letter_R, Letter_S, Letter_T, Letter_U, Letter_V, Letter_W, Letter_X, Letter_Y, Letter_Z, Space, Enter, Escape, Tab, Backspace, CapsLock, Shift, Control, Alt, Arrow_Up, Arrow_Down, Arrow_Left, Arrow_Right, } Event_Key :: struct { virtual_key: Virtual_Key, state: Event_Key_State, } Event_Resize :: struct { old_width, old_height: u16, new_width, new_height: u16, } create :: proc(width, height: u16) -> (^Window, bool) { assert(width > 0 && height > 0) w := new(Window) w.width = width w.height = height when ODIN_OS == .Windows { if !init_window_windows(w) { free(w) return nil, false } } else { #assert(false, "Missing implementation for 'create'.") } set_title(w, "Window") return w, true } set_title :: proc(window: ^Window, title: string) { assert(window != nil) window.title = title when ODIN_OS == .Windows { set_title_windows(window) } else { #assert(false, "Missing implementation for 'set_title'.") } } get_pointer_to_surface :: proc(window: ^Window) -> rawptr { when ODIN_OS == .Windows { // fmt.printfln("HWND: %v.", window.backend.hwnd) return window.backend.hwnd } else { #assert(false, "Missing implementation for 'get_pointer_to_surface'.") } } update :: proc(window: ^Window, out_event: ^Event) -> bool { assert(window != nil) event: Event when ODIN_OS == .Windows { event = update_windows(window) } else { #assert(false, "Missing implementation for 'set_title'.") } out_event^ = event if out_event^ == nil { return false } return true } destroy :: proc(window: ^Window) { assert(window != nil) destroy_windows(window) free(window) window^ = {} }