Просмотр исходного кода

Merge remote-tracking branch 'ftphikari/master'

Holger Lindner 3 лет назад
Родитель
Сommit
193822b45d
2 измененных файлов с 346 добавлено и 271 удалено
  1. 260 31
      core/sys/windows/types.odin
  2. 86 240
      core/sys/windows/user32.odin

+ 260 - 31
core/sys/windows/types.odin

@@ -21,6 +21,7 @@ HINSTANCE :: HANDLE
 HMODULE :: distinct HINSTANCE
 HRESULT :: distinct LONG
 HWND :: distinct HANDLE
+HDC :: distinct HANDLE
 HMONITOR :: distinct HANDLE
 HICON :: distinct HANDLE
 HCURSOR :: distinct HANDLE
@@ -41,12 +42,12 @@ SIZE_T :: uint
 PSIZE_T :: ^SIZE_T
 WORD :: u16
 CHAR :: c_char
-UINT_PTR :: uint
 ULONG_PTR :: uint
 PULONG_PTR :: ^ULONG_PTR
 LPULONG_PTR :: ^ULONG_PTR
 DWORD_PTR :: ULONG_PTR
 LONG_PTR :: int
+UINT_PTR :: uintptr
 ULONG :: c_ulong
 UCHAR :: BYTE
 NTSTATUS :: c.long
@@ -186,6 +187,82 @@ GetFileExInfoStandard: GET_FILEEX_INFO_LEVELS : 0
 GetFileExMaxInfoLevel: GET_FILEEX_INFO_LEVELS : 1
 
 
+WNDPROC :: #type proc "stdcall" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
+
+WNDCLASSA :: struct {
+	style: UINT,
+	lpfnWndProc: WNDPROC,
+	cbClsExtra: c_int,
+	cbWndExtra: c_int,
+	hInstance: HINSTANCE,
+	hIcon: HICON,
+	hCursor: HCURSOR,
+	hbrBackground: HBRUSH,
+	lpszMenuName: LPCSTR,
+	lpszClassName: LPCSTR,
+}
+
+WNDCLASSW :: struct {
+	style: UINT,
+	lpfnWndProc: WNDPROC,
+	cbClsExtra: c_int,
+	cbWndExtra: c_int,
+	hInstance: HINSTANCE,
+	hIcon: HICON,
+	hCursor: HCURSOR,
+	hbrBackground: HBRUSH,
+	lpszMenuName: LPCWSTR,
+	lpszClassName: LPCWSTR,
+}
+
+WNDCLASSEXA :: struct {
+	cbSize: UINT,
+	style: UINT,
+	lpfnWndProc: WNDPROC,
+	cbClsExtra: c_int,
+	cbWndExtra: c_int,
+	hInstance: HINSTANCE,
+	hIcon: HICON,
+	hCursor: HCURSOR,
+	hbrBackground: HBRUSH,
+	lpszMenuName: LPCSTR,
+	lpszClassName: LPCSTR,
+	hIconSm: HICON,
+}
+
+WNDCLASSEXW :: struct {
+	cbSize: UINT,
+	style: UINT,
+	lpfnWndProc: WNDPROC,
+	cbClsExtra: c_int,
+	cbWndExtra: c_int,
+	hInstance: HINSTANCE,
+	hIcon: HICON,
+	hCursor: HCURSOR,
+	hbrBackground: HBRUSH,
+	lpszMenuName: LPCWSTR,
+	lpszClassName: LPCWSTR,
+	hIconSm: HICON,
+}
+
+MSG :: struct {
+	hwnd: HWND,
+	message: UINT,
+	wParam: WPARAM,
+	lParam: LPARAM,
+	time: DWORD,
+	pt: POINT,
+}
+
+PAINTSTRUCT :: struct {
+	hdc: HDC,
+	fErase: BOOL,
+	rcPaint: RECT,
+	fRestore: BOOL,
+	fIncUpdate: BOOL,
+	rgbReserved: [32]BYTE,
+}
+
 WIN32_FIND_DATAW :: struct {
 	dwFileAttributes: DWORD,
 	ftCreationTime: FILETIME,
@@ -199,6 +276,158 @@ WIN32_FIND_DATAW :: struct {
 	cAlternateFileName: [14]wchar_t,
 }
 
+CREATESTRUCTA :: struct {
+	lpCreateParams: LPVOID,
+	hInstance:      HINSTANCE,
+	hMenu:          HMENU,
+	hwndParent:     HWND,
+	cy:             c_int,
+	cx:             c_int,
+	y:              c_int,
+	x:              c_int,
+	style:          LONG,
+	lpszName:       LPCSTR,
+	lpszClass:      LPCSTR,
+	dwExStyle:      DWORD,
+}
+
+CREATESTRUCTW:: struct {
+	lpCreateParams: LPVOID,
+	hInstance:      HINSTANCE,
+	hMenu:          HMENU,
+	hwndParent:     HWND,
+	cy:             c_int,
+	cx:             c_int,
+	y:              c_int,
+	x:              c_int,
+	style:          LONG,
+	lpszName:       LPCWSTR,
+	lpszClass:      LPCWSTR,
+	dwExStyle:      DWORD,
+}
+
+CS_VREDRAW         : UINT : 0x0001
+CS_HREDRAW         : UINT : 0x0002
+CS_DBLCLKS         : UINT : 0x0008
+CS_OWNDC           : UINT : 0x0020
+CS_CLASSDC         : UINT : 0x0040
+CS_PARENTDC        : UINT : 0x0080
+CS_NOCLOSE         : UINT : 0x0200
+CS_SAVEBITS        : UINT : 0x0800
+CS_BYTEALIGNCLIENT : UINT : 0x1000
+CS_BYTEALIGNWINDOW : UINT : 0x2000
+CS_GLOBALCLASS     : UINT : 0x4000
+CS_DROPSHADOW      : UINT : 0x0002_0000
+
+GWL_EXSTYLE    : c_int : -20
+GWLP_HINSTANCE : c_int : -6
+GWLP_ID        : c_int : -12
+GWL_STYLE      : c_int : -16
+GWLP_USERDATA  : c_int : -21
+GWLP_WNDPROC   : c_int : -4
+
+WS_BORDER           : UINT : 0x0080_0000
+WS_CAPTION          : UINT : 0x00C0_0000
+WS_CHILD            : UINT : 0x4000_0000
+WS_CHILDWINDOW      : UINT : WS_CHILD
+WS_CLIPCHILDREN     : UINT : 0x0200_0000
+WS_CLIPSIBLINGS     : UINT : 0x0400_0000
+WS_DISABLED         : UINT : 0x0800_0000
+WS_DLGFRAME         : UINT : 0x0040_0000
+WS_GROUP            : UINT : 0x0002_0000
+WS_HSCROLL          : UINT : 0x0010_0000
+WS_ICONIC           : UINT : 0x2000_0000
+WS_MAXIMIZE         : UINT : 0x0100_0000
+WS_MAXIMIZEBOX      : UINT : 0x0001_0000
+WS_MINIMIZE         : UINT : 0x2000_0000
+WS_MINIMIZEBOX      : UINT : 0x0002_0000
+WS_OVERLAPPED       : UINT : 0x0000_0000
+WS_OVERLAPPEDWINDOW : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
+WS_POPUP			: UINT : 0x8000_0000
+WS_POPUPWINDOW      : UINT : WS_POPUP | WS_BORDER | WS_SYSMENU
+WS_SIZEBOX          : UINT : 0x0004_0000
+WS_SYSMENU          : UINT : 0x0008_0000
+WS_TABSTOP          : UINT : 0x0001_0000
+WS_THICKFRAME       : UINT : 0x0004_0000
+WS_TILED            : UINT : 0x0000_0000
+WS_TILEDWINDOW      : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE
+WS_VISIBLE          : UINT : 0x1000_0000
+WS_VSCROLL          : UINT : 0x0020_0000
+
+QS_ALLEVENTS      : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY
+QS_ALLINPUT       : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE
+QS_ALLPOSTMESSAGE : UINT : 0x0100
+QS_HOTKEY         : UINT : 0x0080
+QS_INPUT          : UINT : QS_MOUSE | QS_KEY | QS_RAWINPUT
+QS_KEY            : UINT : 0x0001
+QS_MOUSE          : UINT : QS_MOUSEMOVE | QS_MOUSEBUTTON
+QS_MOUSEBUTTON    : UINT : 0x0004
+QS_MOUSEMOVE      : UINT : 0x0002
+QS_PAINT          : UINT : 0x0020
+QS_POSTMESSAGE    : UINT : 0x0008
+QS_RAWINPUT       : UINT : 0x0400
+QS_SENDMESSAGE    : UINT : 0x0040
+QS_TIMER          : UINT : 0x0010
+
+PM_NOREMOVE : UINT : 0x0000
+PM_REMOVE   : UINT : 0x0001
+PM_NOYIELD  : UINT : 0x0002
+
+PM_QS_INPUT       : UINT : QS_INPUT << 16
+PM_QS_PAINT       : UINT : QS_PAINT << 16
+PM_QS_POSTMESSAGE : UINT : (QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16
+PM_QS_SENDMESSAGE : UINT : QS_SENDMESSAGE << 16
+
+SW_HIDE            : c_int : 0
+SW_SHOWNORMAL      : c_int : SW_NORMAL
+SW_NORMAL          : c_int : 1
+SW_SHOWMINIMIZED   : c_int : 2
+SW_SHOWMAXIMIZED   : c_int : SW_MAXIMIZE
+SW_MAXIMIZE        : c_int : 3
+SW_SHOWNOACTIVATE  : c_int : 4
+SW_SHOW            : c_int : 5
+SW_MINIMIZE        : c_int : 6
+SW_SHOWMINNOACTIVE : c_int : 7
+SW_SHOWNA          : c_int : 8
+SW_RESTORE         : c_int : 9
+SW_SHOWDEFAULT     : c_int : 10
+SW_FORCEMINIMIZE   : c_int : 11
+
+CW_USEDEFAULT      : c_int : -2147483648
+
+_IDC_APPSTARTING := rawptr(uintptr(32650))
+_IDC_ARROW       := rawptr(uintptr(32512))
+_IDC_CROSS       := rawptr(uintptr(32515))
+_IDC_HAND        := rawptr(uintptr(32649))
+_IDC_HELP        := rawptr(uintptr(32651))
+_IDC_IBEAM       := rawptr(uintptr(32513))
+_IDC_ICON        := rawptr(uintptr(32641))
+_IDC_NO          := rawptr(uintptr(32648))
+_IDC_SIZE        := rawptr(uintptr(32640))
+_IDC_SIZEALL     := rawptr(uintptr(32646))
+_IDC_SIZENESW    := rawptr(uintptr(32643))
+_IDC_SIZENS      := rawptr(uintptr(32645))
+_IDC_SIZENWSE    := rawptr(uintptr(32642))
+_IDC_SIZEWE      := rawptr(uintptr(32644))
+_IDC_UPARROW     := rawptr(uintptr(32516))
+_IDC_WAIT        := rawptr(uintptr(32514))
+IDC_APPSTARTING := cstring(_IDC_APPSTARTING)
+IDC_ARROW       := cstring(_IDC_ARROW)
+IDC_CROSS       := cstring(_IDC_CROSS)
+IDC_HAND        := cstring(_IDC_HAND)
+IDC_HELP        := cstring(_IDC_HELP)
+IDC_IBEAM       := cstring(_IDC_IBEAM)
+IDC_ICON        := cstring(_IDC_ICON)
+IDC_NO          := cstring(_IDC_NO)
+IDC_SIZE        := cstring(_IDC_SIZE)
+IDC_SIZEALL     := cstring(_IDC_SIZEALL)
+IDC_SIZENESW    := cstring(_IDC_SIZENESW)
+IDC_SIZENS      := cstring(_IDC_SIZENS)
+IDC_SIZENWSE    := cstring(_IDC_SIZENWSE)
+IDC_SIZEWE      := cstring(_IDC_SIZEWE)
+IDC_UPARROW     := cstring(_IDC_UPARROW)
+IDC_WAIT        := cstring(_IDC_WAIT)
+
 WSA_FLAG_OVERLAPPED: DWORD : 0x01
 WSA_FLAG_NO_HANDLE_INHERIT: DWORD : 0x80
 
@@ -792,17 +1021,17 @@ SYSTEM_INFO :: struct {
 
 // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw
 OSVERSIONINFOEXW :: struct {
-    dwOSVersionInfoSize: ULONG,
-    dwMajorVersion:      ULONG,
-    dwMinorVersion:      ULONG,
-    dwBuildNumber:       ULONG,
-    dwPlatformId:        ULONG,
-    szCSDVersion:        [128]WCHAR,
-    wServicePackMajor:   USHORT,
-    wServicePackMinor:   USHORT,
-    wSuiteMask:          USHORT,
-    wProductType:        UCHAR,
-    wReserved:           UCHAR,
+	dwOSVersionInfoSize: ULONG,
+	dwMajorVersion:      ULONG,
+	dwMinorVersion:      ULONG,
+	dwBuildNumber:       ULONG,
+	dwPlatformId:        ULONG,
+	szCSDVersion:        [128]WCHAR,
+	wServicePackMajor:   USHORT,
+	wServicePackMinor:   USHORT,
+	wSuiteMask:          USHORT,
+	wProductType:        UCHAR,
+	wReserved:           UCHAR,
 }
 
 // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-quota_limits
@@ -845,24 +1074,24 @@ PROFILEINFOW :: struct {
 	lpDefaultPath: LPWSTR,
 	lpServerName: LPWSTR,
 	lpPolicyPath: LPWSTR,
-  	hProfile: HANDLE,
+	hProfile: HANDLE,
 }
 
 // Used in LookupAccountNameW
 SID_NAME_USE :: distinct DWORD
 
 SID_TYPE :: enum SID_NAME_USE {
-  User = 1,
-  Group,
-  Domain,
-  Alias,
-  WellKnownGroup,
-  DeletedAccount,
-  Invalid,
-  Unknown,
-  Computer,
-  Label,
-  LogonSession,
+	User = 1,
+	Group,
+	Domain,
+	Alias,
+	WellKnownGroup,
+	DeletedAccount,
+	Invalid,
+	Unknown,
+	Computer,
+	Label,
+	LogonSession,
 }
 
 SECURITY_MAX_SID_SIZE :: 68
@@ -877,7 +1106,7 @@ SID :: struct #packed {
 #assert(size_of(SID) == SECURITY_MAX_SID_SIZE)
 
 SID_IDENTIFIER_AUTHORITY :: struct #packed {
-    Value: [6]u8,
+	Value: [6]u8,
 }
 
 // For NetAPI32
@@ -909,11 +1138,11 @@ USER_INFO_FLAG :: enum DWORD {
 	Passwd_Cant_Change              = 6,  // 1 <<  6: 0x0040,
 	Encrypted_Text_Password_Allowed = 7,  // 1 <<  7: 0x0080,
 
-    Temp_Duplicate_Account          = 8,  // 1 <<  8: 0x0100,
-    Normal_Account                  = 9,  // 1 <<  9: 0x0200,
-    InterDomain_Trust_Account       = 11, // 1 << 11: 0x0800,
-    Workstation_Trust_Account       = 12, // 1 << 12: 0x1000,
-    Server_Trust_Account            = 13, // 1 << 13: 0x2000,
+	Temp_Duplicate_Account          = 8,  // 1 <<  8: 0x0100,
+	Normal_Account                  = 9,  // 1 <<  9: 0x0200,
+	InterDomain_Trust_Account       = 11, // 1 << 11: 0x0800,
+	Workstation_Trust_Account       = 12, // 1 << 12: 0x1000,
+	Server_Trust_Account            = 13, // 1 << 13: 0x2000,
 }
 USER_INFO_FLAGS :: distinct bit_set[USER_INFO_FLAG]
 
@@ -1260,4 +1489,4 @@ SYSTEMTIME :: struct {
 	minute:       WORD,
 	second:       WORD,
 	milliseconds: WORD,
-}
+}

+ 86 - 240
core/sys/windows/user32.odin

@@ -1,256 +1,85 @@
 // +build windows
 package sys_windows
-foreign import user32 "system:User32.lib"
-
-WNDPROC :: proc "stdcall" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
-
-CS_VREDRAW         : UINT : 0x0001
-CS_HREDRAW         : UINT : 0x0002
-CS_DBLCLKS         : UINT : 0x0008
-CS_OWNDC           : UINT : 0x0020
-CS_CLASSDC         : UINT : 0x0040
-CS_PARENTDC        : UINT : 0x0080
-CS_NOCLOSE         : UINT : 0x0200
-CS_SAVEBITS        : UINT : 0x0800
-CS_BYTEALIGNCLIENT : UINT : 0x1000
-CS_BYTEALIGNWINDOW : UINT : 0x2000
-CS_GLOBALCLASS     : UINT : 0x4000
-CS_DROPSHADOW      : UINT : 0x0002_0000
-
-GWL_EXSTYLE    : c_int : -20
-GWLP_HINSTANCE : c_int : -6
-GWLP_ID        : c_int : -12
-GWL_STYLE      : c_int : -16
-GWLP_USERDATA  : c_int : -21
-GWLP_WNDPROC   : c_int : -4
-
-WS_BORDER           : UINT : 0x0080_0000
-WS_CAPTION          : UINT : 0x00C0_0000
-WS_CHILD            : UINT : 0x4000_0000
-WS_CHILDWINDOW      : UINT : WS_CHILD
-WS_CLIPCHILDREN     : UINT : 0x0200_0000
-WS_CLIPSIBLINGS     : UINT : 0x0400_0000
-WS_DISABLED         : UINT : 0x0800_0000
-WS_DLGFRAME         : UINT : 0x0040_0000
-WS_GROUP            : UINT : 0x0002_0000
-WS_HSCROLL          : UINT : 0x0010_0000
-WS_ICONIC           : UINT : 0x2000_0000
-WS_MAXIMIZE         : UINT : 0x0100_0000
-WS_MAXIMIZEBOX      : UINT : 0x0001_0000
-WS_MINIMIZE         : UINT : 0x2000_0000
-WS_MINIMIZEBOX      : UINT : 0x0002_0000
-WS_OVERLAPPED       : UINT : 0x0000_0000
-WS_OVERLAPPEDWINDOW : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
-WS_POPUP			: UINT : 0x8000_0000
-WS_POPUPWINDOW      : UINT : WS_POPUP | WS_BORDER | WS_SYSMENU
-WS_SIZEBOX          : UINT : 0x0004_0000
-WS_SYSMENU          : UINT : 0x0008_0000
-WS_TABSTOP          : UINT : 0x0001_0000
-WS_THICKFRAME       : UINT : 0x0004_0000
-WS_TILED            : UINT : 0x0000_0000
-WS_TILEDWINDOW      : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE
-WS_VISIBLE          : UINT : 0x1000_0000
-WS_VSCROLL          : UINT : 0x0020_0000
-
-QS_ALLEVENTS      : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY
-QS_ALLINPUT       : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE
-QS_ALLPOSTMESSAGE : UINT : 0x0100
-QS_HOTKEY         : UINT : 0x0080
-QS_INPUT          : UINT : QS_MOUSE | QS_KEY | QS_RAWINPUT
-QS_KEY            : UINT : 0x0001
-QS_MOUSE          : UINT : QS_MOUSEMOVE | QS_MOUSEBUTTON
-QS_MOUSEBUTTON    : UINT : 0x0004
-QS_MOUSEMOVE      : UINT : 0x0002
-QS_PAINT          : UINT : 0x0020
-QS_POSTMESSAGE    : UINT : 0x0008
-QS_RAWINPUT       : UINT : 0x0400
-QS_SENDMESSAGE    : UINT : 0x0040
-QS_TIMER          : UINT : 0x0010
-
-PM_NOREMOVE : UINT : 0x0000
-PM_REMOVE   : UINT : 0x0001
-PM_NOYIELD  : UINT : 0x0002
-
-PM_QS_INPUT       : UINT : QS_INPUT << 16
-PM_QS_PAINT       : UINT : QS_PAINT << 16
-PM_QS_POSTMESSAGE : UINT : (QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16
-PM_QS_SENDMESSAGE : UINT : QS_SENDMESSAGE << 16
-
-SW_HIDE            : c_int : 0
-SW_SHOWNORMAL      : c_int : SW_NORMAL
-SW_NORMAL          : c_int : 1
-SW_SHOWMINIMIZED   : c_int : 2
-SW_SHOWMAXIMIZED   : c_int : SW_MAXIMIZE
-SW_MAXIMIZE        : c_int : 3
-SW_SHOWNOACTIVATE  : c_int : 4
-SW_SHOW            : c_int : 5
-SW_MINIMIZE        : c_int : 6
-SW_SHOWMINNOACTIVE : c_int : 7
-SW_SHOWNA          : c_int : 8
-SW_RESTORE         : c_int : 9
-SW_SHOWDEFAULT     : c_int : 10
-SW_FORCEMINIMIZE   : c_int : 11
-
-CW_USEDEFAULT      : c_int : -2147483648
-
-WNDCLASSA :: struct {
-	style:         UINT,
-	lpfnWndProc:   WNDPROC,
-	cbClsExtra:    c_int,
-	cbWndExtra:    c_int,
-	hInstance:     HINSTANCE,
-	hIcon:         HICON,
-	hCursor:       HCURSOR,
-	hbrBackground: HBRUSH,
-	lpszMenuName:  LPCSTR,
-	lpszClassName: LPCSTR,
-}
-
-WNDCLASSW :: struct {
-	style:         UINT,
-	lpfnWndProc:   WNDPROC,
-	cbClsExtra:    c_int,
-	cbWndExtra:    c_int,
-	hInstance:     HINSTANCE,
-	hIcon:         HICON,
-	hCursor:       HCURSOR,
-	hbrBackground: HBRUSH,
-	lpszMenuName:  LPCWSTR,
-	lpszClassName: LPCWSTR,
-}
-
-WNDCLASSEXA :: struct {
-	cbSize:        UINT,
-	style:         UINT,
-	lpfnWndProc:   WNDPROC,
-	cbClsExtra:    c_int,
-	cbWndExtra:    c_int,
-	hInstance:     HINSTANCE,
-	hIcon:         HICON,
-	hCursor:       HCURSOR,
-	hbrBackground: HBRUSH,
-	lpszMenuName:  LPCSTR,
-	lpszClassName: LPCSTR,
-	hIconSm:       HICON,
-}
-
-WNDCLASSEXW :: struct {
-	cbSize:        UINT,
-	style:         UINT,
-	lpfnWndProc:   WNDPROC,
-	cbClsExtra:    c_int,
-	cbWndExtra:    c_int,
-	hInstance:     HINSTANCE,
-	hIcon:         HICON,
-	hCursor:       HCURSOR,
-	hbrBackground: HBRUSH,
-	lpszMenuName:  LPCWSTR,
-	lpszClassName: LPCWSTR,
-	hIconSm:       HICON,
-}
-
-MSG :: struct {
-	hwnd:     HWND,
-	message:  UINT,
-	wParam:   WPARAM,
-	lParam:   LPARAM,
-	time:     DWORD,
-	pt:       POINT,
-	lPrivate: DWORD,
-}
-
-CREATESTRUCTA :: struct {
-	lpCreateParams: LPVOID,
-	hInstance:      HINSTANCE,
-	hMenu:          HMENU,
-	hwndParent:     HWND,
-	cy:             c_int,
-	cx:             c_int,
-	y:              c_int,
-	x:              c_int,
-	style:          LONG,
-	lpszName:       LPCSTR,
-	lpszClass:      LPCSTR,
-	dwExStyle:      DWORD,
-}
-
-CREATESTRUCTW:: struct {
-	lpCreateParams: LPVOID,
-	hInstance:      HINSTANCE,
-	hMenu:          HMENU,
-	hwndParent:     HWND,
-	cy:             c_int,
-	cx:             c_int,
-	y:              c_int,
-	x:              c_int,
-	style:          LONG,
-	lpszName:       LPCWSTR,
-	lpszClass:      LPCWSTR,
-	dwExStyle:      DWORD,
-}
-
-_IDC_APPSTARTING := rawptr(uintptr(32650))
-_IDC_ARROW       := rawptr(uintptr(32512))
-_IDC_CROSS       := rawptr(uintptr(32515))
-_IDC_HAND        := rawptr(uintptr(32649))
-_IDC_HELP        := rawptr(uintptr(32651))
-_IDC_IBEAM       := rawptr(uintptr(32513))
-_IDC_ICON        := rawptr(uintptr(32641))
-_IDC_NO          := rawptr(uintptr(32648))
-_IDC_SIZE        := rawptr(uintptr(32640))
-_IDC_SIZEALL     := rawptr(uintptr(32646))
-_IDC_SIZENESW    := rawptr(uintptr(32643))
-_IDC_SIZENS      := rawptr(uintptr(32645))
-_IDC_SIZENWSE    := rawptr(uintptr(32642))
-_IDC_SIZEWE      := rawptr(uintptr(32644))
-_IDC_UPARROW     := rawptr(uintptr(32516))
-_IDC_WAIT        := rawptr(uintptr(32514))
-IDC_APPSTARTING := cstring(_IDC_APPSTARTING)
-IDC_ARROW       := cstring(_IDC_ARROW)
-IDC_CROSS       := cstring(_IDC_CROSS)
-IDC_HAND        := cstring(_IDC_HAND)
-IDC_HELP        := cstring(_IDC_HELP)
-IDC_IBEAM       := cstring(_IDC_IBEAM)
-IDC_ICON        := cstring(_IDC_ICON)
-IDC_NO          := cstring(_IDC_NO)
-IDC_SIZE        := cstring(_IDC_SIZE)
-IDC_SIZEALL     := cstring(_IDC_SIZEALL)
-IDC_SIZENESW    := cstring(_IDC_SIZENESW)
-IDC_SIZENS      := cstring(_IDC_SIZENS)
-IDC_SIZENWSE    := cstring(_IDC_SIZENWSE)
-IDC_SIZEWE      := cstring(_IDC_SIZEWE)
-IDC_UPARROW     := cstring(_IDC_UPARROW)
-IDC_WAIT        := cstring(_IDC_WAIT)
 
+foreign import user32 "system:User32.lib"
 
 @(default_calling_convention="stdcall")
 foreign user32 {
-
 	GetClassInfoA :: proc(hInstance: HINSTANCE, lpClassNAme: LPCSTR, lpWndClass: ^WNDCLASSA) -> BOOL ---
 	GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassNAme: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL ---
 	GetClassInfoExA :: proc(hInsatnce: HINSTANCE, lpszClass: LPCSTR, lpwcx: ^WNDCLASSEXA) -> BOOL ---
 	GetClassInfoExW :: proc(hInsatnce: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL ---
+
 	GetClassLongPtrA :: proc(hWnd: HWND, nIndex: c_int) -> DWORD ---
 	GetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int) -> DWORD ---
+	SetClassLongPtrA :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
+	SetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
+
 	GetClassNameA :: proc(hWnd: HWND, lpClassName: LPSTR, nMaxCount: c_int) -> c_int ---
 	GetClassNameW :: proc(hWnd: HWND, lpClassName: LPWSTR, nMaxCount: c_int) -> c_int ---
+
 	GetWindowLongPtrA :: proc(hWnd: HWND, nIndex: c_int) -> LONG_PTR ---
 	GetWindowLongPtrW :: proc(hWnd: HWND, nIndex: c_int) -> LONG_PTR ---
-	RegisterClassA :: proc(^WNDCLASSA) -> ATOM ---
-	RegisterClassW :: proc(^WNDCLASSW) -> ATOM ---
-	RegisterClassExA :: proc(^WNDCLASSEXA) -> ATOM ---
-	RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM ---
-	SetClassLongPtrA :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
-	SetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
 	SetWindowLongPtrA :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> LONG_PTR ---
 	SetWindowLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> LONG_PTR ---
-	UnregisterClassA :: proc(lpClassName: LPCSTR, hInstance: HINSTANCE) -> BOOL ---
-	UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL ---
 
-	CreateWindowA :: proc(lpClassName: LPCSTR, lpWindowName: LPCSTR, dwStyle: DWORD, x: c_int, y: c_int, nWidth: c_int, nHeight: c_int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: LPARAM) -> HWND ---
-	CreateWindowW :: proc(lpClassName: LPCWSTR, lpWindowName: LPCWSTR, dwStyle: DWORD, x: c_int, y: c_int, nWidth: c_int, nHeight: c_int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: LPARAM) -> HWND ---
-	CreateWindowExA :: proc(dwExStyle: DWORD, lpClassName: LPCSTR, lpWindowName: LPCSTR, dwStyle: DWORD, x: c_int, y: c_int, nWidth: c_int, nHeight: c_int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: LPARAM) -> HWND ---
-	CreateWindowExW :: proc(dwExStyle: DWORD, lpClassName: LPCWSTR, lpWindowName: LPCWSTR, dwStyle: DWORD, x: c_int, y: c_int, nWidth: c_int, nHeight: c_int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: LPARAM) -> HWND ---
+	RegisterClassA :: proc(lpWndClass: ^WNDCLASSA) -> ATOM ---
+	RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM ---
+	RegisterClassExA :: proc(^WNDCLASSEXA) -> ATOM ---
+	RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM ---
+
+	CreateWindowA :: proc(
+		lpClassName: LPCSTR,
+		lpWindowName: LPCSTR,
+		dwStyle: DWORD,
+		X: c_int,
+		Y: c_int,
+		nWidth: c_int,
+		nHeight: c_int,
+		hWndParent: HWND,
+		hMenu: HMENU,
+		hInstance: HINSTANCE,
+		lpParam: LPARAM) -> HWND ---
+	CreateWindowW :: proc(
+		lpClassName: LPCWSTR,
+		lpWindowName: LPCWSTR,
+		dwStyle: DWORD,
+		X: c_int,
+		Y: c_int,
+		nWidth: c_int,
+		nHeight: c_int,
+		hWndParent: HWND,
+		hMenu: HMENU,
+		hInstance: HINSTANCE,
+		lpParam: LPARAM) -> HWND ---
+	CreateWindowExA :: proc(
+		dwExStyle: DWORD,
+		lpClassName: LPCSTR,
+		lpWindowName: LPCSTR,
+		dwStyle: DWORD,
+		X: c_int,
+		Y: c_int,
+		nWidth: c_int,
+		nHeight: c_int,
+		hWndParent: HWND,
+		hMenu: HMENU,
+		hInstance: HINSTANCE,
+		lpParam: LPVOID,
+	) -> HWND ---
+	CreateWindowExW :: proc(
+		dwExStyle: DWORD,
+		lpClassName: LPCWSTR,
+		lpWindowName: LPCWSTR,
+		dwStyle: DWORD,
+		X: c_int,
+		Y: c_int,
+		nWidth: c_int,
+		nHeight: c_int,
+		hWndParent: HWND,
+		hMenu: HMENU,
+		hInstance: HINSTANCE,
+		lpParam: LPVOID,
+	) -> HWND ---
 
 	DestroyWindow :: proc(hWnd: HWND) -> BOOL ---
 
@@ -258,26 +87,43 @@ foreign user32 {
 
 	GetMessageA :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> BOOL ---
 	GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> BOOL ---
-	PeekMessageA :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL ---
-	PeekMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL ---
 
 	TranslateMessage :: proc(lpMsg: ^MSG) -> BOOL ---
 	DispatchMessageA :: proc(lpMsg: ^MSG) -> LRESULT ---
 	DispatchMessageW :: proc(lpMsg: ^MSG) -> LRESULT ---
 
-	PostQuitMessage :: proc(nExitCode: c_int) ---
+	PeekMessageA :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL ---
+	PeekMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL ---
 
 	PostMessageA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> BOOL ---
 	PostMessageW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> BOOL ---
-
 	SendMessageA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
 	SendMessageW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
 
+	PostThreadMessageA :: proc(idThread: DWORD, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> BOOL ---
+	PostThreadMessageW :: proc(idThread: DWORD, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> BOOL ---
+
+	PostQuitMessage :: proc(nExitCode: c_int) ---
+
 	GetQueueStatus :: proc(flags: UINT) -> DWORD ---
 
-	DefWindowProcA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParma: LPARAM) -> LRESULT ---
-	DefWindowProcW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParma: LPARAM) -> LRESULT ---
+	DefWindowProcA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
+	DefWindowProcW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
+
+	FindWindowExA :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCSTR, lpszWindow: LPCSTR) -> HWND ---
+	FindWindowExW :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCWSTR, lpszWindow: LPCWSTR) -> HWND ---
 
+	LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON ---
+	LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON ---
 	LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR ---
 	LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR ---
+
+	GetClientRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL ---
+
+	GetWindowDC :: proc(hWnd: HWND) -> HDC ---
+	GetDC :: proc(hWnd: HWND) -> HDC ---
+	ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> c_int ---
+
+	BeginPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> HDC ---
+	EndPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> BOOL ---
 }