user32.odin 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. // +build windows
  2. package win32
  3. foreign import "system:user32.lib"
  4. import "core:intrinsics"
  5. Menu_Bar_Info :: struct {
  6. size: u32,
  7. bar: Rect,
  8. menu: Hmenu,
  9. wnd_menu: Hwnd,
  10. fields: u8,
  11. // field.bar_focused: 1,
  12. // field.focuses: 1,
  13. }
  14. Menu_Item_Info_A :: struct {
  15. size: u32,
  16. mask: u32,
  17. type: u32,
  18. state: u32,
  19. id: u32,
  20. submenu: Hmenu,
  21. bmp_checked: Hbitmap,
  22. bmp_unchecked: Hbitmap,
  23. item_data: u32,
  24. type_data: cstring,
  25. cch: u32,
  26. }
  27. Menu_Item_Info_W :: struct {
  28. size: u32,
  29. mask: u32,
  30. type: u32,
  31. state: u32,
  32. id: u32,
  33. submenu: Hmenu,
  34. bmp_checked: Hbitmap,
  35. bmp_unchecked: Hbitmap,
  36. item_data: u32,
  37. type_data: Wstring,
  38. cch: u32,
  39. }
  40. MF_BYCOMMAND :: 0x00000000
  41. MF_BYPOSITION :: 0x00000400
  42. MF_BITMAP :: 0x00000004
  43. MF_CHECKED :: 0x00000008
  44. MF_DISABLED :: 0x00000002
  45. MF_ENABLED :: 0x00000000
  46. MF_GRAYED :: 0x00000001
  47. MF_MENUBARBREAK :: 0x00000020
  48. MF_MENUBREAK :: 0x00000040
  49. MF_OWNERDRAW :: 0x00000100
  50. MF_POPUP :: 0x00000010
  51. MF_SEPARATOR :: 0x00000800
  52. MF_STRING :: 0x00000000
  53. MF_UNCHECKED :: 0x00000000
  54. MB_ABORTRETRYIGNORE :: 0x00000002
  55. MB_CANCELTRYCONTINUE :: 0x00000006
  56. MB_HELP :: 0x00004000
  57. MB_OK :: 0x00000000
  58. MB_OKCANCEL :: 0x00000001
  59. MB_RETRYCANCEL :: 0x00000005
  60. MB_YESNO :: 0x00000004
  61. MB_YESNOCANCEL :: 0x00000003
  62. MB_ICONEXCLAMATION :: 0x00000030
  63. MB_ICONWARNING :: 0x00000030
  64. MB_ICONINFORMATION :: 0x00000040
  65. MB_ICONASTERISK :: 0x00000040
  66. MB_ICONQUESTION :: 0x00000020
  67. MB_ICONSTOP :: 0x00000010
  68. MB_ICONERROR :: 0x00000010
  69. MB_ICONHAND :: 0x00000010
  70. MB_DEFBUTTON1 :: 0x00000000
  71. MB_DEFBUTTON2 :: 0x00000100
  72. MB_DEFBUTTON3 :: 0x00000200
  73. MB_DEFBUTTON4 :: 0x00000300
  74. MB_APPLMODAL :: 0x00000000
  75. MB_SYSTEMMODAL :: 0x00001000
  76. MB_TASKMODAL :: 0x00002000
  77. MB_DEFAULT_DESKTOP_ONLY :: 0x00020000
  78. MB_RIGHT :: 0x00080000
  79. MB_RTLREADING :: 0x00100000
  80. MB_SETFOREGROUND :: 0x00010000
  81. MB_TOPMOST :: 0x00040000
  82. MB_SERVICE_NOTIFICATION :: 0x00200000
  83. @(default_calling_convention = "std")
  84. foreign user32 {
  85. @(link_name="GetDesktopWindow") get_desktop_window :: proc() -> Hwnd ---
  86. when !intrinsics.is_package_imported("raylib") { // NOTE(bill): this is a bit of hack but it's to get around the namespace collisions
  87. @(link_name="ShowCursor")show_cursor :: proc(show: Bool) -> i32 ---
  88. }
  89. @(link_name="GetCursorPos") get_cursor_pos :: proc(p: ^Point) -> Bool ---
  90. @(link_name="SetCursorPos") set_cursor_pos :: proc(x, y: i32) -> Bool ---
  91. @(link_name="ScreenToClient") screen_to_client :: proc(h: Hwnd, p: ^Point) -> Bool ---
  92. @(link_name="ClientToScreen") client_to_screen :: proc(h: Hwnd, p: ^Point) -> Bool ---
  93. @(link_name="PostQuitMessage") post_quit_message :: proc(exit_code: i32) ---
  94. @(link_name="SetWindowTextA") set_window_text_a :: proc(hwnd: Hwnd, c_string: cstring) -> Bool ---
  95. @(link_name="SetWindowTextW") set_window_text_w :: proc(hwnd: Hwnd, c_string: Wstring) -> Bool ---
  96. @(link_name="RegisterClassA") register_class_a :: proc(wc: ^Wnd_Class_A) -> i16 ---
  97. @(link_name="RegisterClassW") register_class_w :: proc(wc: ^Wnd_Class_W) -> i16 ---
  98. @(link_name="RegisterClassExA") register_class_ex_a :: proc(wc: ^Wnd_Class_Ex_A) -> i16 ---
  99. @(link_name="RegisterClassExW") register_class_ex_w :: proc(wc: ^Wnd_Class_Ex_W) -> i16 ---
  100. @(link_name="CreateWindowExA")
  101. create_window_ex_a :: proc(ex_style: u32,
  102. class_name, title: cstring,
  103. style: u32,
  104. x, y, w, h: i32,
  105. parent: Hwnd, menu: Hmenu, instance: Hinstance,
  106. param: rawptr) -> Hwnd ---
  107. @(link_name="CreateWindowExW")
  108. create_window_ex_w :: proc(ex_style: u32,
  109. class_name, title: Wstring,
  110. style: u32,
  111. x, y, w, h: i32,
  112. parent: Hwnd, menu: Hmenu, instance: Hinstance,
  113. param: rawptr) -> Hwnd ---
  114. @(link_name="ShowWindow") show_window :: proc(hwnd: Hwnd, cmd_show: i32) -> Bool ---
  115. @(link_name="TranslateMessage") translate_message :: proc(msg: ^Msg) -> Bool ---
  116. @(link_name="DispatchMessageA") dispatch_message_a :: proc(msg: ^Msg) -> Lresult ---
  117. @(link_name="DispatchMessageW") dispatch_message_w :: proc(msg: ^Msg) -> Lresult ---
  118. @(link_name="UpdateWindow") update_window :: proc(hwnd: Hwnd) -> Bool ---
  119. @(link_name="GetMessageA") get_message_a :: proc(msg: ^Msg, hwnd: Hwnd, msg_filter_min, msg_filter_max: u32) -> Bool ---
  120. @(link_name="GetMessageW") get_message_w :: proc(msg: ^Msg, hwnd: Hwnd, msg_filter_min, msg_filter_max: u32) -> Bool ---
  121. @(link_name="PeekMessageA") peek_message_a :: proc(msg: ^Msg, hwnd: Hwnd, msg_filter_min, msg_filter_max, remove_msg: u32) -> Bool ---
  122. @(link_name="PeekMessageW") peek_message_w :: proc(msg: ^Msg, hwnd: Hwnd, msg_filter_min, msg_filter_max, remove_msg: u32) -> Bool ---
  123. @(link_name="PostMessageA") post_message_a :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Bool ---
  124. @(link_name="PostMessageW") post_message_w :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Bool ---
  125. @(link_name="SendMessageA") send_message_a :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Lresult ---
  126. @(link_name="SendMessageW") send_message_w :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Lresult ---
  127. @(link_name="DefWindowProcA") def_window_proc_a :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Lresult ---
  128. @(link_name="DefWindowProcW") def_window_proc_w :: proc(hwnd: Hwnd, msg: u32, wparam: Wparam, lparam: Lparam) -> Lresult ---
  129. @(link_name="AdjustWindowRect") adjust_window_rect :: proc(rect: ^Rect, style: u32, menu: Bool) -> Bool ---
  130. @(link_name="GetActiveWindow") get_active_window :: proc() -> Hwnd ---
  131. @(link_name="DestroyWindow") destroy_window :: proc(wnd: Hwnd) -> Bool ---
  132. @(link_name="DescribePixelFormat") describe_pixel_format :: proc(dc: Hdc, pixel_format: i32, bytes: u32, pfd: ^Pixel_Format_Descriptor) -> i32 ---
  133. @(link_name="GetMonitorInfoA") get_monitor_info_a :: proc(monitor: Hmonitor, mi: ^Monitor_Info) -> Bool ---
  134. @(link_name="MonitorFromWindow") monitor_from_window :: proc(wnd: Hwnd, flags: u32) -> Hmonitor ---
  135. @(link_name="SetWindowPos") set_window_pos :: proc(wnd: Hwnd, wndInsertAfter: Hwnd, x, y, width, height: i32, flags: u32) -> Bool ---
  136. @(link_name="GetWindowPlacement") get_window_placement :: proc(wnd: Hwnd, wndpl: ^Window_Placement) -> Bool ---
  137. @(link_name="SetWindowPlacement") set_window_placement :: proc(wnd: Hwnd, wndpl: ^Window_Placement) -> Bool ---
  138. @(link_name="GetWindowRect") get_window_rect :: proc(wnd: Hwnd, rect: ^Rect) -> Bool ---
  139. @(link_name="GetWindowLongPtrA") get_window_long_ptr_a :: proc(wnd: Hwnd, index: i32) -> Long_Ptr ---
  140. @(link_name="SetWindowLongPtrA") set_window_long_ptr_a :: proc(wnd: Hwnd, index: i32, new: Long_Ptr) -> Long_Ptr ---
  141. @(link_name="GetWindowLongPtrW") get_window_long_ptr_w :: proc(wnd: Hwnd, index: i32) -> Long_Ptr ---
  142. @(link_name="SetWindowLongPtrW") set_window_long_ptr_w :: proc(wnd: Hwnd, index: i32, new: Long_Ptr) -> Long_Ptr ---
  143. @(link_name="GetWindowText") get_window_text :: proc(wnd: Hwnd, str: cstring, maxCount: i32) -> i32 ---
  144. @(link_name="GetClientRect") get_client_rect :: proc(hwnd: Hwnd, rect: ^Rect) -> Bool ---
  145. @(link_name="GetDC") get_dc :: proc(h: Hwnd) -> Hdc ---
  146. @(link_name="ReleaseDC") release_dc :: proc(wnd: Hwnd, hdc: Hdc) -> i32 ---
  147. @(link_name="MapVirtualKeyA") map_virtual_key_a :: proc(scancode: u32, map_type: u32) -> u32 ---
  148. @(link_name="MapVirtualKeyW") map_virtual_key_w :: proc(scancode: u32, map_type: u32) -> u32 ---
  149. @(link_name="GetKeyState") get_key_state :: proc(v_key: i32) -> i16 ---
  150. @(link_name="GetAsyncKeyState") get_async_key_state :: proc(v_key: i32) -> i16 ---
  151. @(link_name="SetForegroundWindow") set_foreground_window :: proc(h: Hwnd) -> Bool ---
  152. @(link_name="SetFocus") set_focus :: proc(h: Hwnd) -> Hwnd ---
  153. @(link_name="LoadImageA") load_image_a :: proc(instance: Hinstance, name: cstring, type_: u32, x_desired, y_desired : i32, load : u32) -> Handle ---
  154. @(link_name="LoadIconA") load_icon_a :: proc(instance: Hinstance, icon_name: cstring) -> Hicon ---
  155. @(link_name="DestroyIcon") destroy_icon :: proc(icon: Hicon) -> Bool ---
  156. @(link_name="LoadCursorA") load_cursor_a :: proc(instance: Hinstance, cursor_name: cstring) -> Hcursor ---
  157. @(link_name="LoadCursorW") load_cursor_w :: proc(instance: Hinstance, cursor_name: Wstring) -> Hcursor ---
  158. @(link_name="GetCursor") get_cursor :: proc() -> Hcursor ---
  159. @(link_name="SetCursor") set_cursor :: proc(cursor: Hcursor) -> Hcursor ---
  160. @(link_name="RegisterRawInputDevices") register_raw_input_devices :: proc(raw_input_device: ^Raw_Input_Device, num_devices, size: u32) -> Bool ---
  161. @(link_name="GetRawInputData") get_raw_input_data :: proc(raw_input: Hrawinput, command: u32, data: rawptr, size: ^u32, size_header: u32) -> u32 ---
  162. @(link_name="MapVirtualKeyExW") map_virtual_key_ex_w :: proc(code, map_type: u32, hkl: HKL) -> u32 ---
  163. @(link_name="MapVirtualKeyExA") map_virtual_key_ex_a :: proc(code, map_type: u32, hkl: HKL) -> u32 ---
  164. @(link_name="EnumDisplayMonitors") enum_display_monitors :: proc(hdc: Hdc, rect: ^Rect, enum_proc: Monitor_Enum_Proc, lparam: Lparam) -> bool ---
  165. }
  166. @(default_calling_convention = "std")
  167. foreign user32 {
  168. @(link_name="CreateMenu") create_menu :: proc() -> Hmenu ---
  169. @(link_name="CreatePopupMenu") create_popup_menu :: proc() -> Hmenu ---
  170. @(link_name="DestroyMenu") destroy_menu :: proc(menu: Hmenu) -> Bool ---
  171. @(link_name="DeleteMenu") delete_menu :: proc(menu: Hmenu, position: u32, flags: u32) -> Bool ---
  172. @(link_name="EnableMenuItem") enable_menu_item :: proc(menu: Hmenu, id_enable_itme: i32, enable: u32) -> Bool ---
  173. @(link_name="EndMenu") end_menu :: proc(menu: Hmenu, flags: u32, id_new_item: Uint_Ptr, new_item: cstring) -> Bool ---
  174. @(link_name="GetMenu") get_menu :: proc(wnd: Hwnd) -> Hmenu ---
  175. @(link_name="GetMenuBarInfo") get_menu_bar_info :: proc(wnd: Hwnd, id_object, id_item: u32, mbi: ^Menu_Bar_Info) -> Hmenu ---
  176. @(link_name="GetMenuStringA") get_menu_string_a :: proc(menu: Hmenu, id_item: u32, s: cstring, cch_max: i32, flags: u32) -> i32 ---
  177. @(link_name="GetMenuStringW") get_menu_string_w :: proc(menu: Hmenu, id_item: u32, s: Wstring, cch_max: i32, flags: u32) -> i32 ---
  178. @(link_name="GetMenuState") get_menu_state :: proc(menu: Hmenu, id: u32, flags: u32) -> u32 ---
  179. @(link_name="GetMenuItemRect") get_menu_item_rect :: proc(wnd: Hwnd, menu: Hmenu, id_item: u32, item: ^Rect) -> Bool ---
  180. @(link_name="SetMenu") set_menu :: proc(wnd: Hwnd, menu: Hmenu) -> Bool ---
  181. @(link_name="DrawMenuBar") draw_menu_bar :: proc(wnd: Hwnd) -> Bool ---
  182. @(link_name="InsertMenuA") insert_menu_a :: proc(menu: Hmenu, position: u32, flags: u32, id_new_item: Uint_Ptr, new_item: cstring) -> Bool ---
  183. @(link_name="InsertMenuW") insert_menu_w :: proc(menu: Hmenu, position: u32, flags: u32, id_new_item: Uint_Ptr, new_item: Wstring) -> Bool ---
  184. @(link_name="InsertMenuItemA") insert_menu_item_a :: proc(hmenu: Hmenu, item: u32, fByPosition: Bool, lpmi: ^Menu_Item_Info_A) -> Bool ---
  185. @(link_name="InsertMenuItemW") insert_menu_item_w :: proc(hmenu: Hmenu, item: u32, fByPosition: Bool, lpmi: ^Menu_Item_Info_W) -> Bool ---
  186. @(link_name="AppendMenuA") append_menu_a :: proc(menu: Hmenu, flags: u32, id_new_item: Uint_Ptr, new_item: cstring) -> Bool ---
  187. @(link_name="AppendMenuW") append_menu_w :: proc(menu: Hmenu, flags: u32, id_new_item: Uint_Ptr, new_item: Wstring) -> Bool ---
  188. @(link_name="CheckMenuItem") check_menu_item :: proc(menu: Hmenu, id_check_item: u32, check: u32) -> u32 ---
  189. @(link_name="CheckMenuRadioItem") check_menu_radio_item :: proc(menu: Hmenu, first, last: u32, check: u32, flags: u32) -> Bool ---
  190. @(link_name="GetPropA") get_prop_a :: proc(wnd: Hwnd, s: cstring) -> Handle ---
  191. @(link_name="GetPropW") get_prop_w :: proc(wnd: Hwnd, s: Wstring) -> Handle ---
  192. @(link_name="MessageBoxA") message_box_a :: proc(wnd: Hwnd, text, caption: cstring, type: u32) -> i32 ---
  193. @(link_name="MessageBoxW") message_box_w :: proc(wnd: Hwnd, text, caption: Wstring, type: u32) -> i32 ---
  194. @(link_name="MessageBoxExA") message_box_ex_a :: proc(wnd: Hwnd, text, caption: cstring, type: u32, language_id: u16) -> i32 ---
  195. @(link_name="MessageBoxExW") message_box_ex_w :: proc(wnd: Hwnd, text, caption: Wstring, type: u32, language_id: u16) -> i32 ---
  196. @(link_name="BeginPaint") begin_paint :: proc(wnd: Hwnd, paint: ^Paint_Struct) -> Hdc ---
  197. @(link_name="EndPaint") end_paint :: proc(wnd: Hwnd, paint: ^Paint_Struct) -> Bool ---
  198. }
  199. _IDC_APPSTARTING := rawptr(uintptr(32650))
  200. _IDC_ARROW := rawptr(uintptr(32512))
  201. _IDC_CROSS := rawptr(uintptr(32515))
  202. _IDC_HAND := rawptr(uintptr(32649))
  203. _IDC_HELP := rawptr(uintptr(32651))
  204. _IDC_IBEAM := rawptr(uintptr(32513))
  205. _IDC_ICON := rawptr(uintptr(32641))
  206. _IDC_NO := rawptr(uintptr(32648))
  207. _IDC_SIZE := rawptr(uintptr(32640))
  208. _IDC_SIZEALL := rawptr(uintptr(32646))
  209. _IDC_SIZENESW := rawptr(uintptr(32643))
  210. _IDC_SIZENS := rawptr(uintptr(32645))
  211. _IDC_SIZENWSE := rawptr(uintptr(32642))
  212. _IDC_SIZEWE := rawptr(uintptr(32644))
  213. _IDC_UPARROW := rawptr(uintptr(32516))
  214. _IDC_WAIT := rawptr(uintptr(32514))
  215. IDC_APPSTARTING := cstring(_IDC_APPSTARTING)
  216. IDC_ARROW := cstring(_IDC_ARROW)
  217. IDC_CROSS := cstring(_IDC_CROSS)
  218. IDC_HAND := cstring(_IDC_HAND)
  219. IDC_HELP := cstring(_IDC_HELP)
  220. IDC_IBEAM := cstring(_IDC_IBEAM)
  221. IDC_ICON := cstring(_IDC_ICON)
  222. IDC_NO := cstring(_IDC_NO)
  223. IDC_SIZE := cstring(_IDC_SIZE)
  224. IDC_SIZEALL := cstring(_IDC_SIZEALL)
  225. IDC_SIZENESW := cstring(_IDC_SIZENESW)
  226. IDC_SIZENS := cstring(_IDC_SIZENS)
  227. IDC_SIZENWSE := cstring(_IDC_SIZENWSE)
  228. IDC_SIZEWE := cstring(_IDC_SIZEWE)
  229. IDC_UPARROW := cstring(_IDC_UPARROW)
  230. IDC_WAIT := cstring(_IDC_WAIT)