package window import "core:container/queue" import "core:fmt" Window :: struct { title: string, width, height: u16, backend: Backend_Info, event_queue: Event_Queue, } Event_Queue :: queue.Queue(Event) Event :: union { Event_Quit, Event_Input, Event_Resize, } Event_Quit :: struct {} Event_Input_State :: enum { Up, Down, } 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_Keyboard :: struct { virtual_key: Virtual_Key, state: Event_Input_State, } Event_Mouse :: union { Event_Mouse_Move, Event_Mouse_Button, } Event_Mouse_Move :: struct { x, y: u16, } Mouse_Button :: enum { Left, Middle, Right } Event_Mouse_Button :: struct { button: Mouse_Button, state: Event_Input_State } Event_Input :: union { Event_Keyboard, Event_Mouse, // TODO: SS - Add 'Event_Gamepad'? } Event_Resize :: struct { 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 queue.init(&w.event_queue, 1024) 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) assert(out_event != nil) when ODIN_OS == .Windows { update_windows(window) } else { #assert(false, "Missing implementation for 'set_title'.") } out_event^ = nil event, ok := queue.pop_front_safe(&window.event_queue) if !ok { return false } assert(event != nil) out_event^ = event return true } destroy :: proc(window: ^Window) { assert(window != nil) when ODIN_OS == .Windows { destroy_windows(window) } else { #assert(false, "Missing implementation for 'destroy'.") } queue.destroy(&window.event_queue) free(window) }