win32.odin 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. #foreign_system_library "user32" when ODIN_OS == "windows"
  2. #foreign_system_library "gdi32" when ODIN_OS == "windows"
  3. HANDLE :: type rawptr
  4. HWND :: type HANDLE
  5. HDC :: type HANDLE
  6. HINSTANCE :: type HANDLE
  7. HICON :: type HANDLE
  8. HCURSOR :: type HANDLE
  9. HMENU :: type HANDLE
  10. HBRUSH :: type HANDLE
  11. HGDIOBJ :: type HANDLE
  12. HMODULE :: type HANDLE
  13. WPARAM :: type uint
  14. LPARAM :: type int
  15. LRESULT :: type int
  16. ATOM :: type i16
  17. BOOL :: type i32
  18. WNDPROC :: type proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT
  19. INVALID_HANDLE_VALUE :: (-1 as int) as HANDLE
  20. CS_VREDRAW :: 0x0001
  21. CS_HREDRAW :: 0x0002
  22. CS_OWNDC :: 0x0020
  23. CW_USEDEFAULT :: -0x80000000
  24. WS_OVERLAPPED :: 0
  25. WS_MAXIMIZEBOX :: 0x00010000
  26. WS_MINIMIZEBOX :: 0x00020000
  27. WS_THICKFRAME :: 0x00040000
  28. WS_SYSMENU :: 0x00080000
  29. WS_CAPTION :: 0x00C00000
  30. WS_VISIBLE :: 0x10000000
  31. WS_OVERLAPPEDWINDOW :: WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
  32. WM_DESTROY :: 0x0002
  33. WM_CLOSE :: 0x0010
  34. WM_QUIT :: 0x0012
  35. WM_KEYDOWN :: 0x0100
  36. WM_KEYUP :: 0x0101
  37. PM_REMOVE :: 1
  38. COLOR_BACKGROUND :: 1 as HBRUSH
  39. BLACK_BRUSH :: 4
  40. SM_CXSCREEN :: 0
  41. SM_CYSCREEN :: 1
  42. SW_SHOW :: 5
  43. POINT :: struct #ordered {
  44. x, y: i32
  45. }
  46. WNDCLASSEXA :: struct #ordered {
  47. size, style: u32
  48. wnd_proc: WNDPROC
  49. cls_extra, wnd_extra: i32
  50. instance: HINSTANCE
  51. icon: HICON
  52. cursor: HCURSOR
  53. background: HBRUSH
  54. menu_name, class_name: ^u8
  55. sm: HICON
  56. }
  57. MSG :: struct #ordered {
  58. hwnd: HWND
  59. message: u32
  60. wparam: WPARAM
  61. lparam: LPARAM
  62. time: u32
  63. pt: POINT
  64. }
  65. RECT :: struct #ordered {
  66. left: i32
  67. top: i32
  68. right: i32
  69. bottom: i32
  70. }
  71. FILETIME :: struct #ordered {
  72. low_date_time, high_date_time: u32
  73. }
  74. BY_HANDLE_FILE_INFORMATION :: struct #ordered {
  75. file_attributes: u32
  76. creation_time,
  77. last_access_time,
  78. last_write_time: FILETIME
  79. volume_serial_number,
  80. file_size_high,
  81. file_size_low,
  82. number_of_links,
  83. file_index_high,
  84. file_index_low: u32
  85. }
  86. WIN32_FILE_ATTRIBUTE_DATA :: struct #ordered {
  87. file_attributes: u32
  88. creation_time,
  89. last_access_time,
  90. last_write_time: FILETIME
  91. file_size_high,
  92. file_size_low: u32
  93. }
  94. GET_FILEEX_INFO_LEVELS :: type i32
  95. GetFileExInfoStandard :: 0 as GET_FILEEX_INFO_LEVELS
  96. GetFileExMaxInfoLevel :: 1 as GET_FILEEX_INFO_LEVELS
  97. GetLastError :: proc() -> i32 #foreign #dll_import
  98. ExitProcess :: proc(exit_code: u32) #foreign #dll_import
  99. GetDesktopWindow :: proc() -> HWND #foreign #dll_import
  100. GetCursorPos :: proc(p: ^POINT) -> i32 #foreign #dll_import
  101. ScreenToClient :: proc(h: HWND, p: ^POINT) -> i32 #foreign #dll_import
  102. GetModuleHandleA :: proc(module_name: ^u8) -> HINSTANCE #foreign #dll_import
  103. GetStockObject :: proc(fn_object: i32) -> HGDIOBJ #foreign #dll_import
  104. PostQuitMessage :: proc(exit_code: i32) #foreign #dll_import
  105. SetWindowTextA :: proc(hwnd: HWND, c_string: ^u8) -> BOOL #foreign #dll_import
  106. QueryPerformanceFrequency :: proc(result: ^i64) -> i32 #foreign #dll_import
  107. QueryPerformanceCounter :: proc(result: ^i64) -> i32 #foreign #dll_import
  108. Sleep :: proc(ms: i32) -> i32 #foreign #dll_import
  109. OutputDebugStringA :: proc(c_str: ^u8) #foreign #dll_import
  110. RegisterClassExA :: proc(wc: ^WNDCLASSEXA) -> ATOM #foreign #dll_import
  111. CreateWindowExA :: proc(ex_style: u32,
  112. class_name, title: ^u8,
  113. style: u32,
  114. x, y, w, h: i32,
  115. parent: HWND, menu: HMENU, instance: HINSTANCE,
  116. param: rawptr) -> HWND #foreign #dll_import
  117. ShowWindow :: proc(hwnd: HWND, cmd_show: i32) -> BOOL #foreign #dll_import
  118. TranslateMessage :: proc(msg: ^MSG) -> BOOL #foreign #dll_import
  119. DispatchMessageA :: proc(msg: ^MSG) -> LRESULT #foreign #dll_import
  120. UpdateWindow :: proc(hwnd: HWND) -> BOOL #foreign #dll_import
  121. PeekMessageA :: proc(msg: ^MSG, hwnd: HWND,
  122. msg_filter_min, msg_filter_max, remove_msg: u32) -> BOOL #foreign #dll_import
  123. DefWindowProcA :: proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT #foreign #dll_import
  124. AdjustWindowRect :: proc(rect: ^RECT, style: u32, menu: BOOL) -> BOOL #foreign #dll_import
  125. GetQueryPerformanceFrequency :: proc() -> i64 {
  126. r: i64
  127. QueryPerformanceFrequency(^r)
  128. return r
  129. }
  130. GetCommandLineA :: proc() -> ^u8 #foreign #dll_import
  131. GetSystemMetrics :: proc(index: i32) -> i32 #foreign #dll_import
  132. GetCurrentThreadId :: proc() -> u32 #foreign #dll_import
  133. // File Stuff
  134. CloseHandle :: proc(h: HANDLE) -> i32 #foreign #dll_import
  135. GetStdHandle :: proc(h: i32) -> HANDLE #foreign #dll_import
  136. CreateFileA :: proc(filename: ^u8, desired_access, share_mode: u32,
  137. security: rawptr,
  138. creation, flags_and_attribs: u32, template_file: HANDLE) -> HANDLE #foreign #dll_import
  139. ReadFile :: proc(h: HANDLE, buf: rawptr, to_read: u32, bytes_read: ^i32, overlapped: rawptr) -> BOOL #foreign #dll_import
  140. WriteFile :: proc(h: HANDLE, buf: rawptr, len: i32, written_result: ^i32, overlapped: rawptr) -> i32 #foreign #dll_import
  141. GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^i64) -> BOOL #foreign #dll_import
  142. GetFileAttributesExA :: proc(filename: ^u8, info_level_id: GET_FILEEX_INFO_LEVELS, file_info: rawptr) -> BOOL #foreign #dll_import
  143. GetFileInformationByHandle :: proc(file_handle: HANDLE, file_info: ^BY_HANDLE_FILE_INFORMATION) -> BOOL #foreign #dll_import
  144. FILE_SHARE_READ :: 0x00000001
  145. FILE_SHARE_WRITE :: 0x00000002
  146. FILE_SHARE_DELETE :: 0x00000004
  147. FILE_GENERIC_ALL :: 0x10000000
  148. FILE_GENERIC_EXECUTE :: 0x20000000
  149. FILE_GENERIC_WRITE :: 0x40000000
  150. FILE_GENERIC_READ :: 0x80000000
  151. STD_INPUT_HANDLE :: -10
  152. STD_OUTPUT_HANDLE :: -11
  153. STD_ERROR_HANDLE :: -12
  154. CREATE_NEW :: 1
  155. CREATE_ALWAYS :: 2
  156. OPEN_EXISTING :: 3
  157. OPEN_ALWAYS :: 4
  158. TRUNCATE_EXISTING :: 5
  159. HeapAlloc :: proc(h: HANDLE, flags: u32, bytes: int) -> rawptr #foreign #dll_import
  160. HeapReAlloc :: proc(h: HANDLE, flags: u32, memory: rawptr, bytes: int) -> rawptr #foreign #dll_import
  161. HeapFree :: proc(h: HANDLE, flags: u32, memory: rawptr) -> BOOL #foreign #dll_import
  162. GetProcessHeap :: proc() -> HANDLE #foreign #dll_import
  163. HEAP_ZERO_MEMORY :: 0x00000008
  164. // Synchronization
  165. SECURITY_ATTRIBUTES :: struct #ordered {
  166. length: u32
  167. security_descriptor: rawptr
  168. inherit_handle: BOOL
  169. }
  170. INFINITE :: 0xffffffff
  171. CreateSemaphoreA :: proc(attributes: ^SECURITY_ATTRIBUTES, initial_count, maximum_count: i32, name: ^byte) -> HANDLE #foreign #dll_import
  172. ReleaseSemaphore :: proc(semaphore: HANDLE, release_count: i32, previous_count: ^i32) -> BOOL #foreign #dll_import
  173. WaitForSingleObject :: proc(handle: HANDLE, milliseconds: u32) -> u32 #foreign #dll_import
  174. InterlockedCompareExchange :: proc(dst: ^i32, exchange, comparand: i32) -> i32 #foreign
  175. InterlockedExchange :: proc(dst: ^i32, desired: i32) -> i32 #foreign
  176. InterlockedExchangeAdd :: proc(dst: ^i32, desired: i32) -> i32 #foreign
  177. InterlockedAnd :: proc(dst: ^i32, desired: i32) -> i32 #foreign
  178. InterlockedOr :: proc(dst: ^i32, desired: i32) -> i32 #foreign
  179. InterlockedCompareExchange64 :: proc(dst: ^i64, exchange, comparand: i64) -> i64 #foreign
  180. InterlockedExchange64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign
  181. InterlockedExchangeAdd64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign
  182. InterlockedAnd64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign
  183. InterlockedOr64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign
  184. _mm_pause :: proc() #foreign
  185. ReadWriteBarrier :: proc() #foreign
  186. WriteBarrier :: proc() #foreign
  187. ReadBarrier :: proc() #foreign
  188. // GDI
  189. BITMAPINFO :: struct #ordered {
  190. HEADER :: struct #ordered {
  191. size: u32
  192. width, height: i32
  193. planes, bit_count: i16
  194. compression: u32
  195. size_image: u32
  196. x_pels_per_meter: i32
  197. y_pels_per_meter: i32
  198. clr_used: u32
  199. clr_important: u32
  200. }
  201. using header: HEADER
  202. colors: [1]RGBQUAD
  203. }
  204. RGBQUAD :: struct #ordered {
  205. blue, green, red, reserved: byte
  206. }
  207. BI_RGB :: 0
  208. DIB_RGB_COLORS :: 0x00
  209. SRCCOPY :: 0x00cc0020 as u32
  210. StretchDIBits :: proc(hdc: HDC,
  211. x_dst, y_dst, width_dst, height_dst: i32,
  212. x_src, y_src, width_src, header_src: i32,
  213. bits: rawptr, bits_info: ^BITMAPINFO,
  214. usage: u32,
  215. rop: u32) -> i32 #foreign #dll_import
  216. LoadLibraryA :: proc(c_str: ^u8) -> HMODULE #foreign
  217. FreeLibrary :: proc(h: HMODULE) #foreign
  218. GetProcAddress :: proc(h: HMODULE, c_str: ^u8) -> rawptr #foreign
  219. GetClientRect :: proc(hwnd: HWND, rect: ^RECT) -> BOOL #foreign
  220. // Windows OpenGL
  221. PFD_TYPE_RGBA :: 0
  222. PFD_TYPE_COLORINDEX :: 1
  223. PFD_MAIN_PLANE :: 0
  224. PFD_OVERLAY_PLANE :: 1
  225. PFD_UNDERLAY_PLANE :: -1
  226. PFD_DOUBLEBUFFER :: 1
  227. PFD_STEREO :: 2
  228. PFD_DRAW_TO_WINDOW :: 4
  229. PFD_DRAW_TO_BITMAP :: 8
  230. PFD_SUPPORT_GDI :: 16
  231. PFD_SUPPORT_OPENGL :: 32
  232. PFD_GENERIC_FORMAT :: 64
  233. PFD_NEED_PALETTE :: 128
  234. PFD_NEED_SYSTEM_PALETTE :: 0x00000100
  235. PFD_SWAP_EXCHANGE :: 0x00000200
  236. PFD_SWAP_COPY :: 0x00000400
  237. PFD_SWAP_LAYER_BUFFERS :: 0x00000800
  238. PFD_GENERIC_ACCELERATED :: 0x00001000
  239. PFD_DEPTH_DONTCARE :: 0x20000000
  240. PFD_DOUBLEBUFFER_DONTCARE :: 0x40000000
  241. PFD_STEREO_DONTCARE :: 0x80000000
  242. HGLRC :: type HANDLE
  243. PROC :: type proc()
  244. wglCreateContextAttribsARBType :: type proc(hdc: HDC, hshareContext: rawptr, attribList: ^i32) -> HGLRC
  245. PIXELFORMATDESCRIPTOR :: struct #ordered {
  246. size,
  247. version,
  248. flags: u32
  249. pixel_type,
  250. color_bits,
  251. red_bits,
  252. red_shift,
  253. green_bits,
  254. green_shift,
  255. blue_bits,
  256. blue_shift,
  257. alpha_bits,
  258. alpha_shift,
  259. accum_bits,
  260. accum_red_bits,
  261. accum_green_bits,
  262. accum_blue_bits,
  263. accum_alpha_bits,
  264. depth_bits,
  265. stencil_bits,
  266. aux_buffers,
  267. layer_type,
  268. reserved: byte
  269. layer_mask,
  270. visible_mask,
  271. damage_mask: u32
  272. }
  273. GetDC :: proc(h: HANDLE) -> HDC #foreign
  274. SetPixelFormat :: proc(hdc: HDC, pixel_format: i32, pfd: ^PIXELFORMATDESCRIPTOR ) -> BOOL #foreign #dll_import
  275. ChoosePixelFormat :: proc(hdc: HDC, pfd: ^PIXELFORMATDESCRIPTOR) -> i32 #foreign #dll_import
  276. SwapBuffers :: proc(hdc: HDC) -> BOOL #foreign #dll_import
  277. ReleaseDC :: proc(wnd: HWND, hdc: HDC) -> i32 #foreign #dll_import
  278. WGL_CONTEXT_MAJOR_VERSION_ARB :: 0x2091
  279. WGL_CONTEXT_MINOR_VERSION_ARB :: 0x2092
  280. WGL_CONTEXT_PROFILE_MASK_ARB :: 0x9126
  281. WGL_CONTEXT_CORE_PROFILE_BIT_ARB :: 0x0001
  282. WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB :: 0x0002
  283. wglCreateContext :: proc(hdc: HDC) -> HGLRC #foreign #dll_import
  284. wglMakeCurrent :: proc(hdc: HDC, hglrc: HGLRC) -> BOOL #foreign #dll_import
  285. wglGetProcAddress :: proc(c_str: ^u8) -> PROC #foreign #dll_import
  286. wglDeleteContext :: proc(hglrc: HGLRC) -> BOOL #foreign #dll_import
  287. GetKeyState :: proc(v_key: i32) -> i16 #foreign #dll_import
  288. GetAsyncKeyState :: proc(v_key: i32) -> i16 #foreign #dll_import
  289. is_key_down :: proc(key: Key_Code) -> bool {
  290. return GetAsyncKeyState(key as i32) < 0
  291. }
  292. Key_Code :: enum i32 {
  293. LBUTTON = 0x01,
  294. RBUTTON = 0x02,
  295. CANCEL = 0x03,
  296. MBUTTON = 0x04,
  297. BACK = 0x08,
  298. TAB = 0x09,
  299. CLEAR = 0x0C,
  300. RETURN = 0x0D,
  301. SHIFT = 0x10,
  302. CONTROL = 0x11,
  303. MENU = 0x12,
  304. PAUSE = 0x13,
  305. CAPITAL = 0x14,
  306. KANA = 0x15,
  307. HANGEUL = 0x15,
  308. HANGUL = 0x15,
  309. JUNJA = 0x17,
  310. FINAL = 0x18,
  311. HANJA = 0x19,
  312. KANJI = 0x19,
  313. ESCAPE = 0x1B,
  314. CONVERT = 0x1C,
  315. NONCONVERT = 0x1D,
  316. ACCEPT = 0x1E,
  317. MODECHANGE = 0x1F,
  318. SPACE = 0x20,
  319. PRIOR = 0x21,
  320. NEXT = 0x22,
  321. END = 0x23,
  322. HOME = 0x24,
  323. LEFT = 0x25,
  324. UP = 0x26,
  325. RIGHT = 0x27,
  326. DOWN = 0x28,
  327. SELECT = 0x29,
  328. PRINT = 0x2A,
  329. EXECUTE = 0x2B,
  330. SNAPSHOT = 0x2C,
  331. INSERT = 0x2D,
  332. DELETE = 0x2E,
  333. HELP = 0x2F,
  334. NUM0 = '0',
  335. NUM1 = '1',
  336. NUM2 = '2',
  337. NUM3 = '3',
  338. NUM4 = '4',
  339. NUM5 = '5',
  340. NUM6 = '6',
  341. NUM7 = '7',
  342. NUM8 = '8',
  343. NUM9 = '9',
  344. A = 'A',
  345. B = 'B',
  346. C = 'C',
  347. D = 'D',
  348. E = 'E',
  349. F = 'F',
  350. G = 'G',
  351. H = 'H',
  352. I = 'I',
  353. J = 'J',
  354. K = 'K',
  355. L = 'L',
  356. M = 'M',
  357. N = 'N',
  358. O = 'O',
  359. P = 'P',
  360. Q = 'Q',
  361. R = 'R',
  362. S = 'S',
  363. T = 'T',
  364. U = 'U',
  365. V = 'V',
  366. W = 'W',
  367. X = 'X',
  368. Y = 'Y',
  369. Z = 'Z',
  370. LWIN = 0x5B,
  371. RWIN = 0x5C,
  372. APPS = 0x5D,
  373. NUMPAD0 = 0x60,
  374. NUMPAD1 = 0x61,
  375. NUMPAD2 = 0x62,
  376. NUMPAD3 = 0x63,
  377. NUMPAD4 = 0x64,
  378. NUMPAD5 = 0x65,
  379. NUMPAD6 = 0x66,
  380. NUMPAD7 = 0x67,
  381. NUMPAD8 = 0x68,
  382. NUMPAD9 = 0x69,
  383. MULTIPLY = 0x6A,
  384. ADD = 0x6B,
  385. SEPARATOR = 0x6C,
  386. SUBTRACT = 0x6D,
  387. DECIMAL = 0x6E,
  388. DIVIDE = 0x6F,
  389. F1 = 0x70,
  390. F2 = 0x71,
  391. F3 = 0x72,
  392. F4 = 0x73,
  393. F5 = 0x74,
  394. F6 = 0x75,
  395. F7 = 0x76,
  396. F8 = 0x77,
  397. F9 = 0x78,
  398. F10 = 0x79,
  399. F11 = 0x7A,
  400. F12 = 0x7B,
  401. F13 = 0x7C,
  402. F14 = 0x7D,
  403. F15 = 0x7E,
  404. F16 = 0x7F,
  405. F17 = 0x80,
  406. F18 = 0x81,
  407. F19 = 0x82,
  408. F20 = 0x83,
  409. F21 = 0x84,
  410. F22 = 0x85,
  411. F23 = 0x86,
  412. F24 = 0x87,
  413. NUMLOCK = 0x90,
  414. SCROLL = 0x91,
  415. LSHIFT = 0xA0,
  416. RSHIFT = 0xA1,
  417. LCONTROL = 0xA2,
  418. RCONTROL = 0xA3,
  419. LMENU = 0xA4,
  420. RMENU = 0xA5,
  421. PROCESSKEY = 0xE5,
  422. ATTN = 0xF6,
  423. CRSEL = 0xF7,
  424. EXSEL = 0xF8,
  425. EREOF = 0xF9,
  426. PLAY = 0xFA,
  427. ZOOM = 0xFB,
  428. NONAME = 0xFC,
  429. PA1 = 0xFD,
  430. OEM_CLEAR = 0xFE,
  431. }