aboutsummaryrefslogtreecommitdiff
path: root/core/sys
diff options
context:
space:
mode:
authorThomas la Cour <tlc@hyrtwol.dk>2024-06-11 18:19:16 +0200
committerThomas la Cour <tlc@hyrtwol.dk>2024-06-11 18:19:16 +0200
commit465ac74020850bb88300d9d89d3cea91307fdd30 (patch)
treef6ed113a04391731ae6b955c99661da724e302c3 /core/sys
parent35a845b93f11b152879bd08f90d196afcb7b8b25 (diff)
more windows stuff
Diffstat (limited to 'core/sys')
-rw-r--r--core/sys/windows/advapi32.odin37
-rw-r--r--core/sys/windows/codepage.odin298
-rw-r--r--core/sys/windows/gdi32.odin365
-rw-r--r--core/sys/windows/kernel32.odin49
-rw-r--r--core/sys/windows/ole32.odin16
-rw-r--r--core/sys/windows/shcore.odin25
-rw-r--r--core/sys/windows/shell32.odin2
-rw-r--r--core/sys/windows/types.odin120
-rw-r--r--core/sys/windows/user32.odin269
-rw-r--r--core/sys/windows/util.odin61
-rw-r--r--core/sys/windows/winerror.odin230
-rw-r--r--core/sys/windows/winmm.odin17
-rw-r--r--core/sys/windows/winnls.odin31
-rw-r--r--core/sys/windows/winver.odin92
14 files changed, 1458 insertions, 154 deletions
diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin
index 163bf2a5e..1e8060b3f 100644
--- a/core/sys/windows/advapi32.odin
+++ b/core/sys/windows/advapi32.odin
@@ -134,6 +134,43 @@ foreign advapi32 {
cbData: DWORD,
) -> LSTATUS ---
+ RegQueryInfoKeyW :: proc(
+ hKey: HKEY,
+ lpClass: LPWSTR,
+ lpcchClass: LPDWORD,
+ lpReserved: LPDWORD,
+ lpcSubKeys: LPDWORD,
+ lpcbMaxSubKeyLen: LPDWORD,
+ lpcbMaxClassLen: LPDWORD,
+ lpcValues: LPDWORD,
+ lpcbMaxValueNameLen: LPDWORD,
+ lpcbMaxValueLen: LPDWORD,
+ lpcbSecurityDescriptor: LPDWORD,
+ lpftLastWriteTime: ^FILETIME,
+ ) -> LSTATUS ---
+
+ RegEnumKeyExW :: proc(
+ hKey: HKEY,
+ dwIndex: DWORD,
+ lpName: LPWSTR,
+ lpcchName: LPDWORD,
+ lpReserved: LPDWORD,
+ lpClass: LPWSTR,
+ lpcchClass: LPDWORD,
+ lpftLastWriteTime: ^FILETIME,
+ ) -> LSTATUS ---
+
+ RegEnumValueW :: proc(
+ hKey: HKEY,
+ dwIndex: DWORD,
+ lpValueName: LPWSTR,
+ lpcchValueName: LPDWORD,
+ lpReserved: LPDWORD,
+ lpType: LPDWORD,
+ lpData: LPBYTE,
+ lpcbData: LPDWORD,
+ ) -> LSTATUS ---
+
GetFileSecurityW :: proc(
lpFileName: LPCWSTR,
RequestedInformation: SECURITY_INFORMATION,
diff --git a/core/sys/windows/codepage.odin b/core/sys/windows/codepage.odin
new file mode 100644
index 000000000..90040f1ee
--- /dev/null
+++ b/core/sys/windows/codepage.odin
@@ -0,0 +1,298 @@
+// +build windows
+package sys_windows
+
+// https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
+CODEPAGE :: enum UINT {
+ // Default to ANSI code page
+ ACP = CP_ACP,
+ // Default to OEM code page
+ OEMCP = CP_OEMCP,
+ // Default to MAC code page
+ MACCP = CP_MACCP,
+ // Current thread's ANSI code page
+ THREAD_ACP = CP_THREAD_ACP,
+ // Symbol translations
+ SYMBOL = CP_SYMBOL,
+
+ // IBM EBCDIC US-Canada
+ IBM037 = 037,
+ // OEM United States
+ IBM437 = 437,
+ // IBM EBCDIC International
+ IBM500 = 500,
+ // Arabic (ASMO 708)
+ ASMO_708 = 708,
+ // Arabic (Transparent ASMO); Arabic (DOS)
+ DOS_720 = 720,
+ // OEM Greek (formerly 437G); Greek (DOS)
+ IBM737 = 737,
+ // OEM Baltic; Baltic (DOS)
+ IBM775 = 775,
+ // OEM Multilingual Latin 1; Western European (DOS)
+ IBM850 = 850,
+ // OEM Latin 2; Central European (DOS)
+ IBM852 = 852,
+ // OEM Cyrillic (primarily Russian)
+ IBM855 = 855,
+ // OEM Turkish; Turkish (DOS)
+ IBM857 = 857,
+ // OEM Multilingual Latin 1 + Euro symbol
+ IBM00858 = 858,
+ // OEM Portuguese; Portuguese (DOS)
+ IBM860 = 860,
+ // OEM Icelandic; Icelandic (DOS)
+ IBM861 = 861,
+ // OEM Hebrew; Hebrew (DOS)
+ DOS_862 = 862,
+ // OEM French Canadian; French Canadian (DOS)
+ IBM863 = 863,
+ // OEM Arabic; Arabic (864)
+ IBM864 = 864,
+ // OEM Nordic; Nordic (DOS)
+ IBM865 = 865,
+ // OEM Russian; Cyrillic (DOS)
+ CP866 = 866,
+ // OEM Modern Greek; Greek, Modern (DOS)
+ IBM869 = 869,
+ // IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2
+ IBM870 = 870,
+ // Thai (Windows)
+ WINDOWS_874 = 874,
+ // IBM EBCDIC Greek Modern
+ CP875 = 875,
+ // ANSI/OEM Japanese; Japanese (Shift-JIS)
+ SHIFT_JIS = 932,
+ // ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)
+ GB2312 = 936,
+ // ANSI/OEM Korean (Unified Hangul Code)
+ KS_C_5601_1987 = 949,
+ // ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5)
+ BIG5 = 950,
+ // IBM EBCDIC Turkish (Latin 5)
+ IBM1026 = 1026,
+ // IBM EBCDIC Latin 1/Open System
+ IBM01047 = 1047,
+ // IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro)
+ IBM01140 = 1140,
+ // IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro)
+ IBM01141 = 1141,
+ // IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro)
+ IBM01142 = 1142,
+ // IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro)
+ IBM01143 = 1143,
+ // IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro)
+ IBM01144 = 1144,
+ // IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro)
+ IBM01145 = 1145,
+ // IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro)
+ IBM01146 = 1146,
+ // IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro)
+ IBM01147 = 1147,
+ // IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro)
+ IBM01148 = 1148,
+ // IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro)
+ IBM01149 = 1149,
+ // Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications
+ UTF16 = 1200,
+ // Unicode UTF-16, big endian byte order; available only to managed applications
+ UNICODEFFFE = 1201,
+ // ANSI Central European; Central European (Windows)
+ WINDOWS_1250 = 1250,
+ // ANSI Cyrillic; Cyrillic (Windows)
+ WINDOWS_1251 = 1251,
+ // ANSI Latin 1; Western European (Windows)
+ WINDOWS_1252 = 1252,
+ // ANSI Greek; Greek (Windows)
+ WINDOWS_1253 = 1253,
+ // ANSI Turkish; Turkish (Windows)
+ WINDOWS_1254 = 1254,
+ // ANSI Hebrew; Hebrew (Windows)
+ WINDOWS_1255 = 1255,
+ // ANSI Arabic; Arabic (Windows)
+ WINDOWS_1256 = 1256,
+ // ANSI Baltic; Baltic (Windows)
+ WINDOWS_1257 = 1257,
+ // ANSI/OEM Vietnamese; Vietnamese (Windows)
+ WINDOWS_1258 = 1258,
+ // Korean (Johab)
+ JOHAB = 1361,
+ // MAC Roman; Western European (Mac)
+ MACINTOSH = 10000,
+ // Japanese (Mac)
+ X_MAC_JAPANESE = 10001,
+ // MAC Traditional Chinese (Big5); Chinese Traditional (Mac)
+ X_MAC_CHINESETRAD = 10002,
+ // Korean (Mac)
+ X_MAC_KOREAN = 10003,
+ // Arabic (Mac)
+ X_MAC_ARABIC = 10004,
+ // Hebrew (Mac)
+ X_MAC_HEBREW = 10005,
+ // Greek (Mac)
+ X_MAC_GREEK = 10006,
+ // Cyrillic (Mac)
+ X_MAC_CYRILLIC = 10007,
+ // MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac)
+ X_MAC_CHINESESIMP = 10008,
+ // Romanian (Mac)
+ X_MAC_ROMANIAN = 10010,
+ // Ukrainian (Mac)
+ X_MAC_UKRAINIAN = 10017,
+ // Thai (Mac)
+ X_MAC_THAI = 10021,
+ // MAC Latin 2; Central European (Mac)
+ X_MAC_CE = 10029,
+ // Icelandic (Mac)
+ X_MAC_ICELANDIC = 10079,
+ // Turkish (Mac)
+ X_MAC_TURKISH = 10081,
+ // Croatian (Mac)
+ X_MAC_CROATIAN = 10082,
+ // Unicode UTF-32, little endian byte order; available only to managed applications
+ UTF32 = 12000,
+ // Unicode UTF-32, big endian byte order; available only to managed applications
+ UTF32BE = 12001,
+ // CNS Taiwan; Chinese Traditional (CNS)
+ X_CHINESE_CNS = 20000,
+ // TCA Taiwan
+ X_CP20001 = 20001,
+ // Eten Taiwan; Chinese Traditional (Eten)
+ X_CHINESE_ETEN = 20002,
+ // IBM5550 Taiwan
+ X_CP20003 = 20003,
+ // TeleText Taiwan
+ X_CP20004 = 20004,
+ // Wang Taiwan
+ X_CP20005 = 20005,
+ // IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5)
+ X_IA5 = 20105,
+ // IA5 German (7-bit)
+ X_IA5_GERMAN = 20106,
+ // IA5 Swedish (7-bit)
+ X_IA5_SWEDISH = 20107,
+ // IA5 Norwegian (7-bit)
+ X_IA5_NORWEGIAN = 20108,
+ // US-ASCII (7-bit)
+ US_ASCII = 20127,
+ // T.61
+ X_CP20261 = 20261,
+ // ISO 6937 Non-Spacing Accent
+ X_CP20269 = 20269,
+ // IBM EBCDIC Germany
+ IBM273 = 20273,
+ // IBM EBCDIC Denmark-Norway
+ IBM277 = 20277,
+ // IBM EBCDIC Finland-Sweden
+ IBM278 = 20278,
+ // IBM EBCDIC Italy
+ IBM280 = 20280,
+ // IBM EBCDIC Latin America-Spain
+ IBM284 = 20284,
+ // IBM EBCDIC United Kingdom
+ IBM285 = 20285,
+ // IBM EBCDIC Japanese Katakana Extended
+ IBM290 = 20290,
+ // IBM EBCDIC France
+ IBM297 = 20297,
+ // IBM EBCDIC Arabic
+ IBM420 = 20420,
+ // IBM EBCDIC Greek
+ IBM423 = 20423,
+ // IBM EBCDIC Hebrew
+ IBM424 = 20424,
+ // IBM EBCDIC Korean Extended
+ X_EBCDIC_KOREANEXTENDED = 20833,
+ // IBM EBCDIC Thai
+ IBM_THAI = 20838,
+ // Russian (KOI8-R); Cyrillic (KOI8-R)
+ KOI8_R = 20866,
+ // IBM EBCDIC Icelandic
+ IBM871 = 20871,
+ // IBM EBCDIC Cyrillic Russian
+ IBM880 = 20880,
+ // IBM EBCDIC Turkish
+ IBM905 = 20905,
+ // IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)
+ IBM00924 = 20924,
+ // Japanese (JIS 0208-1990 and 0212-1990)
+ EUC_JP = 20932,
+ // Simplified Chinese (GB2312); Chinese Simplified (GB2312-80)
+ X_CP20936 = 20936,
+ // Korean Wansung
+ X_CP20949 = 20949,
+ // IBM EBCDIC Cyrillic Serbian-Bulgarian
+ CP1025 = 21025,
+ // Ukrainian (KOI8-U); Cyrillic (KOI8-U)
+ KOI8_U = 21866,
+ // ISO 8859-1 Latin 1; Western European (ISO)
+ ISO_8859_1 = 28591,
+ // ISO 8859-2 Central European; Central European (ISO)
+ ISO_8859_2 = 28592,
+ // ISO 8859-3 Latin 3
+ ISO_8859_3 = 28593,
+ // ISO 8859-4 Baltic
+ ISO_8859_4 = 28594,
+ // ISO 8859-5 Cyrillic
+ ISO_8859_5 = 28595,
+ // ISO 8859-6 Arabic
+ ISO_8859_6 = 28596,
+ // ISO 8859-7 Greek
+ ISO_8859_7 = 28597,
+ // ISO 8859-8 Hebrew; Hebrew (ISO-Visual)
+ ISO_8859_8 = 28598,
+ // ISO 8859-9 Turkish
+ ISO_8859_9 = 28599,
+ // ISO 8859-13 Estonian
+ ISO_8859_13 = 28603,
+ // ISO 8859-15 Latin 9
+ ISO_8859_15 = 28605,
+ // Europa 3
+ X_EUROPA = 29001,
+ // ISO 8859-8 Hebrew; Hebrew (ISO-Logical)
+ ISO_8859_8_I = 38598,
+ // ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS)
+ ISO_2022_JP = 50220,
+ // ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana)
+ CSISO2022JP = 50221,
+ // ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI)
+ ISO_2022_2_JP = 50222,
+ // ISO 2022 Korean
+ ISO_2022_KR = 50225,
+ // ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022)
+ X_CP50227 = 50227,
+ // EUC Japanese
+ EUC_JP_2 = 51932,
+ // EUC Simplified Chinese; Chinese Simplified (EUC)
+ EUC_CN = 51936,
+ // EUC Korean
+ EUC_KR = 51949,
+ // HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ)
+ HZ_GB_2312 = 52936,
+ // **Windows XP and later:** GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030)
+ GB18030 = 54936,
+ // ISCII Devanagari
+ X_ISCII_DE = 57002,
+ // ISCII Bangla
+ X_ISCII_BE = 57003,
+ // ISCII Tamil
+ X_ISCII_TA = 57004,
+ // ISCII Telugu
+ X_ISCII_TE = 57005,
+ // ISCII Assamese
+ X_ISCII_AS = 57006,
+ // ISCII Odia
+ X_ISCII_OR = 57007,
+ // ISCII Kannada
+ X_ISCII_KA = 57008,
+ // ISCII Malayalam
+ X_ISCII_MA = 57009,
+ // ISCII Gujarati
+ X_ISCII_GU = 57010,
+ // ISCII Punjabi
+ X_ISCII_PA = 57011,
+
+ // Unicode (UTF-7)
+ UTF7 = CP_UTF7, /*65000*/
+ // Unicode (UTF-8)
+ UTF8 = CP_UTF8, /*65001*/
+}
diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin
index 6d53845de..6c7eda03d 100644
--- a/core/sys/windows/gdi32.odin
+++ b/core/sys/windows/gdi32.odin
@@ -7,108 +7,97 @@ foreign import gdi32 "system:Gdi32.lib"
@(default_calling_convention="system")
foreign gdi32 {
- GetStockObject :: proc(i: c_int) -> HGDIOBJ ---
+ GetDeviceCaps :: proc(hdc: HDC, index: INT) -> INT ---
+ GetStockObject :: proc(i: INT) -> HGDIOBJ ---
SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ ---
DeleteObject :: proc(ho: HGDIOBJ) -> BOOL ---
SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF ---
+ SetBkMode :: proc(hdc: HDC, mode: BKMODE) -> INT ---
CreateCompatibleDC :: proc(hdc: HDC) -> HDC ---
DeleteDC :: proc(hdc: HDC) -> BOOL ---
+ CancelDC :: proc(hdc: HDC) -> BOOL ---
+ SaveDC :: proc(hdc: HDC) -> INT ---
+ RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL ---
CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH ---
+ CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP ---
+ CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP ---
+ StretchDIBits :: proc(hdc: HDC, xDest: INT, yDest: INT, DestWidth: INT, DestHeight: INT, xSrc: INT, ySrc: INT, SrcWidth: INT, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT ---
+ StretchBlt :: proc(hdcDest: HDC, xDest: INT, yDest: INT, wDest: INT, hDest: INT, hdcSrc: HDC, xSrc: INT, ySrc: INT, wSrc: INT, hSrc: INT, rop: DWORD) -> BOOL ---
- CreateDIBitmap :: proc(
- hdc: HDC,
- pbmih: ^BITMAPINFOHEADER,
- flInit: DWORD,
- pjBits: VOID,
- pbmi: ^BITMAPINFO,
- iUsage: UINT,
- ) -> HBITMAP ---
-
- CreateDIBSection :: proc(
- hdc: HDC,
- pbmi: ^BITMAPINFO,
- usage: UINT,
- ppvBits: VOID,
- hSection: HANDLE,
- offset: DWORD,
- ) -> HBITMAP ---
-
- StretchDIBits :: proc(
- hdc: HDC,
- xDest: c_int,
- yDest: c_int,
- DestWidth: c_int,
- DestHeight: c_int,
- xSrc: c_int,
- ySrc: c_int,
- SrcWidth: c_int,
- SrcHeight: c_int,
- lpBits: VOID,
- lpbmi: ^BITMAPINFO,
- iUsage: UINT,
- rop: DWORD,
- ) -> c_int ---
-
- StretchBlt :: proc(
- hdcDest: HDC,
- xDest: c_int,
- yDest: c_int,
- wDest: c_int,
- hDest: c_int,
- hdcSrc: HDC,
- xSrc: c_int,
- ySrc: c_int,
- wSrc: c_int,
- hSrc: c_int,
- rop: DWORD,
- ) -> BOOL ---
-
- SetPixelFormat :: proc(hdc: HDC, format: c_int, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL ---
- ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> c_int ---
- DescribePixelFormat :: proc(hdc: HDC, iPixelFormat: c_int, nBytes: UINT, ppfd: ^PIXELFORMATDESCRIPTOR) -> c_int ---
- SwapBuffers :: proc(HDC) -> BOOL ---
+ SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL ---
+ ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT ---
+ DescribePixelFormat :: proc(hdc: HDC, iPixelFormat: INT, nBytes: UINT, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT ---
+ SwapBuffers :: proc(hdc: HDC) -> BOOL ---
SetDCBrushColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF ---
GetDCBrushColor :: proc(hdc: HDC) -> COLORREF ---
- PatBlt :: proc(hdc: HDC, x, y, w, h: c_int, rop: DWORD) -> BOOL ---
- Rectangle :: proc(hdc: HDC, left, top, right, bottom: c_int) -> BOOL ---
-
- CreateFontW :: proc(
- cHeight, cWidth, cEscapement, cOrientation, cWeight: c_int,
- bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD,
- iClipPrecision, iQuality, iPitchAndFamily: DWORD,
- pszFaceName: LPCWSTR,
- ) -> HFONT ---
- TextOutW :: proc(hdc: HDC, x, y: c_int, lpString: LPCWSTR, c: c_int) -> BOOL ---
- GetTextExtentPoint32W :: proc(hdc: HDC, lpString: LPCWSTR, c: c_int, psizl: LPSIZE) -> BOOL ---
+ PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL ---
+ Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL ---
+
+ CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT ---
+ CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT ---
+ CreateFontIndirectExW :: proc(unnamedParam1: ^ENUMLOGFONTEXDVW) -> HFONT ---
+ AddFontResourceW :: proc(unnamedParam1: LPCWSTR) -> INT ---
+ AddFontResourceExW :: proc(name: LPCWSTR, fl: DWORD, res: PVOID) -> INT ---
+ AddFontMemResourceEx :: proc(pFileView: PVOID, cjSize: DWORD, pvResrved: PVOID, pNumFonts: ^DWORD) -> HANDLE ---
+ EnumFontsW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT ---
+ EnumFontFamiliesW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT ---
+ EnumFontFamiliesExW :: proc(hdc: HDC, lpLogfont: LPLOGFONTW, lpProc: FONTENUMPROCW, lParam: LPARAM, dwFlags: DWORD) -> INT ---
+
+ TextOutW :: proc(hdc: HDC, x, y: INT, lpString: LPCWSTR, c: INT) -> BOOL ---
+ GetTextExtentPoint32W :: proc(hdc: HDC, lpString: LPCWSTR, c: INT, psizl: LPSIZE) -> BOOL ---
GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL ---
CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH ---
- GetObjectW :: proc(h: HANDLE, c: c_int, pv: LPVOID) -> int ---
- CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: c_int) -> HBITMAP ---
- BitBlt :: proc(hdc: HDC, x, y, cx, cy: c_int, hdcSrc: HDC, x1, y1: c_int, rop: DWORD) -> BOOL ---
- GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> int ---
+ GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> int ---
+ CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP ---
+ BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL ---
+ GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT ---
+ SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT ---
+ SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT ---
+ GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT ---
+
+ CreatePen :: proc(iStyle, cWidth: INT, color: COLORREF) -> HPEN ---
+ ExtCreatePen :: proc(iPenStyle, cWidth: DWORD, plbrush: ^LOGBRUSH, cStyle: DWORD, pstyle: ^DWORD) -> HPEN ---
+ SetDCPenColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF ---
+ GetDCPenColor :: proc(hdc: HDC) -> COLORREF ---
+
+ CreatePalette :: proc(plpal: ^LOGPALETTE) -> HPALETTE ---
+ SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE ---
+ RealizePalette :: proc(hdc: HDC) -> UINT ---
+
+ SetTextColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF ---
+ RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL ---
+ SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF ---
+
+ GdiTransparentBlt :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, crTransparent: UINT) -> BOOL ---
+ GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL ---
+ GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL ---
+}
+
+RGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF {
+ return COLORREF(DWORD(BYTE(r)) | (DWORD(BYTE(g)) << 8) | (DWORD(BYTE(b)) << 16))
+}
+
+PALETTERGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF {
+ return 0x02000000 | RGB(r, g, b)
}
-RGB :: #force_inline proc "contextless" (r, g, b: u8) -> COLORREF {
- return transmute(COLORREF)[4]u8{r, g, b, 0}
+PALETTEINDEX :: #force_inline proc "contextless" (#any_int i: int) -> COLORREF {
+ return COLORREF(DWORD(0x01000000) | DWORD(WORD(i)))
}
FXPT2DOT30 :: distinct fixed.Fixed(i32, 30)
CIEXYZ :: struct {
- ciexyzX: FXPT2DOT30,
- ciexyzY: FXPT2DOT30,
- ciexyzZ: FXPT2DOT30,
+ ciexyzX, ciexyzY, ciexyzZ: FXPT2DOT30,
}
CIEXYZTRIPLE :: struct {
- ciexyzRed: CIEXYZ,
- ciexyzGreen: CIEXYZ,
- ciexyzBlue: CIEXYZ,
+ ciexyzRed, ciexyzGreen, ciexyzBlue: CIEXYZ,
}
// https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapv5header
@@ -138,3 +127,227 @@ BITMAPV5HEADER :: struct {
bV5ProfileSize: DWORD,
bV5Reserved: DWORD,
}
+
+PALETTEENTRY :: struct {
+ peRed, peGreen, peBlue, peFlags: BYTE,
+}
+
+LOGPALETTE :: struct {
+ palVersion: WORD,
+ palNumEntries: WORD,
+ palPalEntry: []PALETTEENTRY,
+}
+
+BKMODE :: enum {
+ TRANSPARENT = 1,
+ OPAQUE = 2,
+}
+
+ICONINFOEXW :: struct {
+ cbSize: DWORD,
+ fIcon: BOOL,
+ xHotspot, yHotspot: DWORD,
+ hbmMask, hbmColor: HBITMAP,
+ wResID: WORD,
+ szModName: [MAX_PATH]WCHAR,
+ szResName: [MAX_PATH]WCHAR,
+}
+PICONINFOEXW :: ^ICONINFOEXW
+
+AC_SRC_OVER :: 0x00
+AC_SRC_ALPHA :: 0x01
+
+TransparentBlt :: GdiTransparentBlt
+GradientFill :: GdiGradientFill
+AlphaBlend :: GdiAlphaBlend
+
+COLOR16 :: USHORT
+TRIVERTEX :: struct {
+ x, y: LONG,
+ Red, Green, Blue, Alpha: COLOR16,
+}
+PTRIVERTEX :: ^TRIVERTEX
+
+GRADIENT_TRIANGLE :: struct {
+ Vertex1, Vertex2, Vertex3: ULONG,
+}
+PGRADIENT_TRIANGLE :: ^GRADIENT_TRIANGLE
+
+GRADIENT_RECT :: struct {
+ UpperLeft, LowerRight: ULONG,
+}
+PGRADIENT_RECT :: ^GRADIENT_RECT
+
+BLENDFUNCTION :: struct {
+ BlendOp, BlendFlags, SourceConstantAlpha, AlphaFormat: BYTE,
+}
+
+GRADIENT_FILL_RECT_H : ULONG : 0x00000000
+GRADIENT_FILL_RECT_V : ULONG : 0x00000001
+GRADIENT_FILL_TRIANGLE : ULONG : 0x00000002
+GRADIENT_FILL_OP_FLAG : ULONG : 0x000000ff
+
+/* Brush Styles */
+BS_SOLID :: 0
+BS_NULL :: 1
+BS_HOLLOW :: BS_NULL
+BS_HATCHED :: 2
+BS_PATTERN :: 3
+BS_INDEXED :: 4
+BS_DIBPATTERN :: 5
+BS_DIBPATTERNPT :: 6
+BS_PATTERN8X8 :: 7
+BS_DIBPATTERN8X8 :: 8
+BS_MONOPATTERN :: 9
+
+/* Hatch Styles */
+HS_HORIZONTAL :: 0 /* ----- */
+HS_VERTICAL :: 1 /* ||||| */
+HS_FDIAGONAL :: 2 /* \\\\\ */
+HS_BDIAGONAL :: 3 /* ///// */
+HS_CROSS :: 4 /* +++++ */
+HS_DIAGCROSS :: 5 /* xxxxx */
+HS_API_MAX :: 12
+
+/* Pen Styles */
+PS_SOLID :: 0
+PS_DASH :: 1 /* ------- */
+PS_DOT :: 2 /* ....... */
+PS_DASHDOT :: 3 /* _._._._ */
+PS_DASHDOTDOT :: 4 /* _.._.._ */
+PS_NULL :: 5
+PS_INSIDEFRAME :: 6
+PS_USERSTYLE :: 7
+PS_ALTERNATE :: 8
+PS_STYLE_MASK :: 0x0000000F
+PS_ENDCAP_ROUND :: 0x00000000
+PS_ENDCAP_SQUARE :: 0x00000100
+PS_ENDCAP_FLAT :: 0x00000200
+PS_ENDCAP_MASK :: 0x00000F00
+PS_JOIN_ROUND :: 0x00000000
+PS_JOIN_BEVEL :: 0x00001000
+PS_JOIN_MITER :: 0x00002000
+PS_JOIN_MASK :: 0x0000F000
+PS_COSMETIC :: 0x00000000
+PS_GEOMETRIC :: 0x00010000
+PS_TYPE_MASK :: 0x000F0000
+
+LOGBRUSH :: struct {
+ lbStyle: UINT,
+ lbColor: COLORREF,
+ lbHatch: ULONG_PTR,
+}
+PLOGBRUSH :: ^LOGBRUSH
+
+/* CombineRgn() Styles */
+RGN_AND :: 1
+RGN_OR :: 2
+RGN_XOR :: 3
+RGN_DIFF :: 4
+RGN_COPY :: 5
+
+/* StretchBlt() Modes */
+// BLACKONWHITE :: 1
+// WHITEONBLACK :: 2
+// COLORONCOLOR :: 3
+// HALFTONE :: 4
+
+/* PolyFill() Modes */
+ALTERNATE :: 1
+WINDING :: 2
+
+/* Layout Orientation Options */
+LAYOUT_RTL :: 0x00000001 // Right to left
+LAYOUT_BTT :: 0x00000002 // Bottom to top
+LAYOUT_VBH :: 0x00000004 // Vertical before horizontal
+LAYOUT_ORIENTATIONMASK :: (LAYOUT_RTL | LAYOUT_BTT | LAYOUT_VBH)
+
+/* Text Alignment Options */
+TA_NOUPDATECP :: 0
+TA_UPDATECP :: 1
+
+TA_LEFT :: 0
+TA_RIGHT :: 2
+TA_CENTER :: 6
+
+TA_TOP :: 0
+TA_BOTTOM :: 8
+TA_BASELINE :: 24
+TA_RTLREADING :: 256
+TA_MASK :: (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)
+
+MM_MAX_NUMAXES :: 16
+DESIGNVECTOR :: struct {
+ dvReserved: DWORD,
+ dvNumAxes: DWORD,
+ dvValues: [MM_MAX_NUMAXES]LONG,
+}
+
+LF_FACESIZE :: 32
+LF_FULLFACESIZE :: 64
+
+LOGFONTW :: struct {
+ lfHeight: LONG,
+ lfWidth: LONG,
+ lfEscapement: LONG,
+ lfOrientation: LONG,
+ lfWeight: LONG,
+ lfItalic: BYTE,
+ lfUnderline: BYTE,
+ lfStrikeOut: BYTE,
+ lfCharSet: BYTE,
+ lfOutPrecision: BYTE,
+ lfClipPrecision: BYTE,
+ lfQuality: BYTE,
+ lfPitchAndFamily: BYTE,
+ lfFaceName: [LF_FACESIZE]WCHAR,
+}
+LPLOGFONTW :: ^LOGFONTW
+
+ENUMLOGFONTW :: struct {
+ elfLogFont: LOGFONTW,
+ elfFullName: [LF_FULLFACESIZE]WCHAR,
+ elfStyle: [LF_FACESIZE]WCHAR,
+}
+LPENUMLOGFONTW :: ^ENUMLOGFONTW
+
+ENUMLOGFONTEXW :: struct {
+ elfLogFont: LOGFONTW,
+ elfFullName: [LF_FULLFACESIZE]WCHAR,
+ elfStyle: [LF_FACESIZE]WCHAR,
+ elfScript: [LF_FACESIZE]WCHAR,
+}
+
+ENUMLOGFONTEXDVW :: struct {
+ elfEnumLogfontEx: ENUMLOGFONTEXW,
+ elfDesignVector: DESIGNVECTOR,
+}
+
+NEWTEXTMETRICW :: struct {
+ tmHeight: LONG,
+ tmAscent: LONG,
+ tmDescent: LONG,
+ tmInternalLeading: LONG,
+ tmExternalLeading: LONG,
+ tmAveCharWidth: LONG,
+ tmMaxCharWidth: LONG,
+ tmWeight: LONG,
+ tmOverhang: LONG,
+ tmDigitizedAspectX: LONG,
+ tmDigitizedAspectY: LONG,
+ tmFirstChar: WCHAR,
+ tmLastChar: WCHAR,
+ tmDefaultChar: WCHAR,
+ tmBreakChar: WCHAR,
+ tmItalic: BYTE,
+ tmUnderlined: BYTE,
+ tmStruckOut: BYTE,
+ tmPitchAndFamily: BYTE,
+ tmCharSet: BYTE,
+ ntmFlags: DWORD,
+ ntmSizeEM: UINT,
+ ntmCellHeight: UINT,
+ ntmAvgWidth: UINT,
+}
+
+FONTENUMPROCW :: #type proc(lpelf: ^ENUMLOGFONTW, lpntm: ^NEWTEXTMETRICW, FontType: DWORD, lParam: LPARAM) -> INT
diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin
index 16b6fa244..eb1fec2df 100644
--- a/core/sys/windows/kernel32.odin
+++ b/core/sys/windows/kernel32.odin
@@ -46,8 +46,11 @@ foreign kernel32 {
dwCursorPosition: COORD) -> BOOL ---
SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE,
wAttributes: WORD) -> BOOL ---
- SetConsoleOutputCP :: proc(wCodePageID: UINT) -> BOOL ---
-
+ GetConsoleCP :: proc() -> CODEPAGE ---
+ SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
+ GetConsoleOutputCP :: proc() -> CODEPAGE ---
+ SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
+
GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
SetHandleInformation :: proc(hObject: HANDLE,
dwMask: DWORD,
@@ -224,6 +227,7 @@ foreign kernel32 {
SetEnvironmentVariableW :: proc(n: LPCWSTR, v: LPCWSTR) -> BOOL ---
GetEnvironmentStringsW :: proc() -> LPWCH ---
FreeEnvironmentStringsW :: proc(env_ptr: LPWCH) -> BOOL ---
+ ExpandEnvironmentStringsW :: proc(lpSrc: LPCWSTR, lpDst: LPWSTR, nSize: DWORD) -> DWORD ---
GetModuleFileNameW :: proc(hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD) -> DWORD ---
CreateDirectoryW :: proc(
lpPathName: LPCWSTR,
@@ -408,11 +412,34 @@ foreign kernel32 {
GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL ---
GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) ---
GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) ---
-
+ GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT ---
+ GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT ---
+ GetSystemDefaultLangID :: proc() -> LANGID ---
+ GetSystemDefaultLCID :: proc() -> LCID ---
+ GetSystemDefaultLocaleName :: proc(lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT ---
+ LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT ---
+ LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID ---
+ SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
+ AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr ---
+ RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL ---
LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE ---
+ LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LOAD_LIBRARY_FLAGS) -> HMODULE ---
FreeLibrary :: proc(h: HMODULE) -> BOOL ---
GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr ---
+ LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL ---
+ FreeResource :: proc(hResData: HGLOBAL) -> BOOL ---
+ LockResource :: proc(hResData: HGLOBAL) -> LPVOID ---
+ SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD ---
+ FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC ---
+ FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC ---
+ EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL ---
+ EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
+ EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
+ EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL ---
+ LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT ---
+ LookupIconIdFromDirectoryEx :: proc(presbits: PBYTE, fIcon: BOOL, cxDesired: INT, cyDesired: INT, Flags: UINT) -> INT ---
+ CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON ---
GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD ---
GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD ---
@@ -1228,3 +1255,19 @@ GMEM_INVALID_HANDLE :: 0x8000
GHND :: (GMEM_MOVEABLE | GMEM_ZEROINIT)
GPTR :: (GMEM_FIXED | GMEM_ZEROINIT)
+
+LOAD_LIBRARY_FLAGS :: enum DWORD {
+ DONT_RESOLVE_DLL_REFERENCES = 0x00000001,
+ LOAD_LIBRARY_AS_DATAFILE = 0x00000002,
+ // reserved for internal LOAD_PACKAGED_LIBRARY = 0x00000004,
+ LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008,
+ LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010,
+ LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020,
+ LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040,
+ LOAD_LIBRARY_REQUIRE_SIGNED_TARGET = 0x00000080,
+ LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100,
+ LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200,
+ LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400,
+ LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800,
+ LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000,
+}
diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin
index d344db5f0..78b4b7226 100644
--- a/core/sys/windows/ole32.odin
+++ b/core/sys/windows/ole32.odin
@@ -38,7 +38,8 @@ LPUNKNOWN :: ^IUnknown
@(default_calling_convention="system")
foreign Ole32 {
- CoInitializeEx :: proc(reserved: rawptr, co_init: COINIT) -> HRESULT ---
+ CoInitialize :: proc(reserved: rawptr = nil) -> HRESULT ---
+ CoInitializeEx :: proc(reserved: rawptr = nil, co_init: COINIT = .APARTMENTTHREADED) -> HRESULT ---
CoUninitialize :: proc() ---
CoCreateInstance :: proc(
@@ -50,4 +51,17 @@ foreign Ole32 {
) -> HRESULT ---
CoTaskMemFree :: proc(pv: rawptr) ---
+
+ CLSIDFromProgID :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT ---
+ CLSIDFromProgIDEx :: proc(lpszProgID, LPCOLESTR, lpclsid: LPCLSID) -> HRESULT ---
+ CLSIDFromString :: proc(lpsz: LPOLESTR, pclsid: LPCLSID) -> HRESULT ---
+ IIDFromString :: proc(lpsz: LPOLESTR, lpiid: LPIID) -> HRESULT ---
+ ProgIDFromCLSID :: proc(clsid: REFCLSID, lplpszProgID: ^LPOLESTR) -> HRESULT ---
+ StringFromCLSID :: proc(rclsid: REFCLSID, lplpsz: ^LPOLESTR) -> HRESULT ---
+ StringFromGUID2 :: proc(rclsid: REFCLSID, lplpsz: LPOLESTR, cchMax: INT) -> INT ---
+ StringFromIID :: proc(rclsid: REFIID, lplpsz: ^LPOLESTR) -> HRESULT ---
+
+ PropVariantClear :: proc(pvar: ^PROPVARIANT) -> HRESULT ---
+ PropVariantCopy :: proc(pvarDest: ^PROPVARIANT, pvarSrc: ^PROPVARIANT) -> HRESULT ---
+ FreePropVariantArray :: proc(cVariants: ULONG, rgvars: ^PROPVARIANT) -> HRESULT ---
}
diff --git a/core/sys/windows/shcore.odin b/core/sys/windows/shcore.odin
new file mode 100644
index 000000000..54f67989e
--- /dev/null
+++ b/core/sys/windows/shcore.odin
@@ -0,0 +1,25 @@
+// +build windows
+
+package sys_windows
+
+foreign import shcore "system:Shcore.lib"
+
+@(default_calling_convention="system")
+foreign shcore {
+ GetProcessDpiAwareness :: proc(hprocess: HANDLE, value: ^PROCESS_DPI_AWARENESS) -> HRESULT ---
+ SetProcessDpiAwareness :: proc(value: PROCESS_DPI_AWARENESS) -> HRESULT ---
+ GetDpiForMonitor :: proc(hmonitor: HMONITOR, dpiType: MONITOR_DPI_TYPE, dpiX: ^UINT, dpiY: ^UINT) -> HRESULT ---
+}
+
+PROCESS_DPI_AWARENESS :: enum DWORD {
+ PROCESS_DPI_UNAWARE = 0,
+ PROCESS_SYSTEM_DPI_AWARE = 1,
+ PROCESS_PER_MONITOR_DPI_AWARE = 2,
+}
+
+MONITOR_DPI_TYPE :: enum DWORD {
+ MDT_EFFECTIVE_DPI = 0,
+ MDT_ANGULAR_DPI = 1,
+ MDT_RAW_DPI = 2,
+ MDT_DEFAULT,
+}
diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin
index 4108d54d8..214a0f501 100644
--- a/core/sys/windows/shell32.odin
+++ b/core/sys/windows/shell32.odin
@@ -30,6 +30,8 @@ foreign shell32 {
SHGetKnownFolderIDList :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppidl: rawptr) -> HRESULT ---
SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT ---
SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT ---
+
+ ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT ---
}
APPBARDATA :: struct {
diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin
index 11d2774d6..35fc68abf 100644
--- a/core/sys/windows/types.odin
+++ b/core/sys/windows/types.odin
@@ -30,14 +30,19 @@ HICON :: distinct HANDLE
HCURSOR :: distinct HANDLE
HMENU :: distinct HANDLE
HBRUSH :: distinct HANDLE
+HPEN :: distinct HANDLE
HGDIOBJ :: distinct HANDLE
HBITMAP :: distinct HANDLE
+HPALETTE :: distinct HANDLE
HGLOBAL :: distinct HANDLE
HHOOK :: distinct HANDLE
HKEY :: distinct HANDLE
HDESK :: distinct HANDLE
HFONT :: distinct HANDLE
HRGN :: distinct HANDLE
+HRSRC :: distinct HANDLE
+HWINSTA :: distinct HANDLE
+HACCEL :: distinct HANDLE
BOOL :: distinct b32
BYTE :: distinct u8
BOOLEAN :: distinct b8
@@ -137,11 +142,14 @@ LPSTR :: ^CHAR
LPWSTR :: ^WCHAR
OLECHAR :: WCHAR
LPOLESTR :: ^OLECHAR
+LPCOLESTR :: LPCSTR
LPFILETIME :: ^FILETIME
LPWSABUF :: ^WSABUF
LPWSAOVERLAPPED :: distinct rawptr
LPWSAOVERLAPPED_COMPLETION_ROUTINE :: distinct rawptr
LPCVOID :: rawptr
+SCODE :: LONG
+PSCODE :: ^SCODE
PACCESS_TOKEN :: PVOID
PSECURITY_DESCRIPTOR :: PVOID
@@ -697,6 +705,92 @@ FW_BLACK :: FW_HEAVY
PTIMERAPCROUTINE :: #type proc "system" (lpArgToCompletionRoutine: LPVOID, dwTimerLowValue, dwTimerHighValue: DWORD)
+// Character Sets
+ANSI_CHARSET :: 0
+DEFAULT_CHARSET :: 1
+SYMBOL_CHARSET :: 2
+SHIFTJIS_CHARSET :: 128
+HANGEUL_CHARSET :: 129
+HANGUL_CHARSET :: 129
+GB2312_CHARSET :: 134
+CHINESEBIG5_CHARSET :: 136
+OEM_CHARSET :: 255
+JOHAB_CHARSET :: 130
+HEBREW_CHARSET :: 177
+ARABIC_CHARSET :: 178
+GREEK_CHARSET :: 161
+TURKISH_CHARSET :: 162
+VIETNAMESE_CHARSET :: 163
+THAI_CHARSET :: 222
+EASTEUROPE_CHARSET :: 238
+RUSSIAN_CHARSET :: 204
+MAC_CHARSET :: 77
+BALTIC_CHARSET :: 186
+
+// Font Signature Bitmaps
+FS_LATIN1 :: 0x00000001
+FS_LATIN2 :: 0x00000002
+FS_CYRILLIC :: 0x00000004
+FS_GREEK :: 0x00000008
+FS_TURKISH :: 0x00000010
+FS_HEBREW :: 0x00000020
+FS_ARABIC :: 0x00000040
+FS_BALTIC :: 0x00000080
+FS_VIETNAMESE :: 0x00000100
+FS_THAI :: 0x00010000
+FS_JISJAPAN :: 0x00020000
+FS_CHINESESIMP :: 0x00040000
+FS_WANSUNG :: 0x00080000
+FS_CHINESETRAD :: 0x00100000
+FS_JOHAB :: 0x00200000
+FS_SYMBOL :: 0x80000000
+
+// Output Precisions
+OUT_DEFAULT_PRECIS :: 0
+OUT_STRING_PRECIS :: 1
+OUT_CHARACTER_PRECIS :: 2
+OUT_STROKE_PRECIS :: 3
+OUT_TT_PRECIS :: 4
+OUT_DEVICE_PRECIS :: 5
+OUT_RASTER_PRECIS :: 6
+OUT_TT_ONLY_PRECIS :: 7
+OUT_OUTLINE_PRECIS :: 8
+OUT_SCREEN_OUTLINE_PRECIS :: 9
+OUT_PS_ONLY_PRECIS :: 10
+
+// Clipping Precisions
+CLIP_DEFAULT_PRECIS :: 0
+CLIP_CHARACTER_PRECIS :: 1
+CLIP_STROKE_PRECIS :: 2
+CLIP_MASK :: 0xf
+CLIP_LH_ANGLES :: 1 << 4
+CLIP_TT_ALWAYS :: 2 << 4
+CLIP_DFA_DISABLE :: 4 << 4
+CLIP_EMBEDDED :: 8 << 4
+
+// Output Qualities
+DEFAULT_QUALITY :: 0
+DRAFT_QUALITY :: 1
+PROOF_QUALITY :: 2
+NONANTIALIASED_QUALITY :: 3
+ANTIALIASED_QUALITY :: 4
+CLEARTYPE_QUALITY :: 5
+CLEARTYPE_NATURAL_QUALITY :: 6
+
+// Font Pitches
+DEFAULT_PITCH :: 0
+FIXED_PITCH :: 1
+VARIABLE_PITCH :: 2
+MONO_FONT :: 8
+
+// Font Families
+FF_DONTCARE :: 0 << 4
+FF_ROMAN :: 1 << 4
+FF_SWISS :: 2 << 4
+FF_MODERN :: 3 << 4
+FF_SCRIPT :: 4 << 4
+FF_DECORATIVE :: 5 << 4
+
TIMERPROC :: #type proc "system" (HWND, UINT, UINT_PTR, DWORD)
WNDPROC :: #type proc "system" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
@@ -922,6 +1016,16 @@ MF_RIGHTJUSTIFY :: 0x00004000
MF_MOUSESELECT :: 0x00008000
MF_END :: 0x00000080 // Obsolete -- only used by old RES files
+// Menu flags for Add/Check/EnableMenuItem()
+MFS_GRAYED :: 0x00000003
+MFS_DISABLED :: MFS_GRAYED
+MFS_CHECKED :: MF_CHECKED
+MFS_HILITE :: MF_HILITE
+MFS_ENABLED :: MF_ENABLED
+MFS_UNCHECKED :: MF_UNCHECKED
+MFS_UNHILITE :: MF_UNHILITE
+MFS_DEFAULT :: MF_DEFAULT
+
// Flags for TrackPopupMenu
TPM_LEFTBUTTON :: 0x0000
TPM_RIGHTBUTTON :: 0x0002
@@ -2179,6 +2283,14 @@ CP_SYMBOL :: 42 // SYMBOL translations
CP_UTF7 :: 65000 // UTF-7 translation
CP_UTF8 :: 65001 // UTF-8 translation
+LCID :: DWORD
+LANGID :: WORD
+
+LANG_NEUTRAL :: 0x00
+LANG_INVARIANT :: 0x7f
+SUBLANG_NEUTRAL :: 0x00 // language neutral
+SUBLANG_DEFAULT :: 0x01 // user default
+
MB_ERR_INVALID_CHARS :: 8
WC_ERR_INVALID_CHARS :: 128
@@ -2393,8 +2505,10 @@ REFIID :: ^GUID
REFGUID :: GUID
IID :: GUID
+LPIID :: ^IID
CLSID :: GUID
REFCLSID :: ^CLSID
+LPCLSID :: ^CLSID
CLSCTX_INPROC_SERVER :: 0x1
CLSCTX_INPROC_HANDLER :: 0x2
@@ -4165,7 +4279,7 @@ DNS_STATUS :: distinct DWORD // zero is success
DNS_INFO_NO_RECORDS :: 9501
DNS_QUERY_NO_RECURSION :: 0x00000004
-DNS_RECORD :: struct {
+DNS_RECORD :: struct { // aka DNS_RECORDA
pNext: ^DNS_RECORD,
pName: cstring,
wType: WORD,
@@ -4208,3 +4322,7 @@ SOCKADDR :: struct {
sa_family: ADDRESS_FAMILY,
sa_data: [14]CHAR,
}
+
+ENUMRESNAMEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, lParam: LONG_PTR)-> BOOL
+ENUMRESTYPEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lParam: LONG_PTR)-> BOOL
+ENUMRESLANGPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, wIDLanguage: LANGID, lParam: LONG_PTR)-> BOOL
diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin
index 1fc0116f5..1463b3906 100644
--- a/core/sys/windows/user32.odin
+++ b/core/sys/windows/user32.odin
@@ -6,16 +6,16 @@ foreign import user32 "system:User32.lib"
@(default_calling_convention="system")
foreign user32 {
- GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassNAme: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL ---
- GetClassInfoExW :: proc(hInsatnce: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL ---
+ GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassName: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL ---
+ GetClassInfoExW :: proc(hInstance: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL ---
- GetClassLongW :: proc(hWnd: HWND, nIndex: c_int) -> DWORD ---
- SetClassLongW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG) -> DWORD ---
+ GetClassLongW :: proc(hWnd: HWND, nIndex: INT) -> DWORD ---
+ SetClassLongW :: proc(hWnd: HWND, nIndex: INT, dwNewLong: LONG) -> DWORD ---
- GetWindowLongW :: proc(hWnd: HWND, nIndex: c_int) -> LONG ---
- SetWindowLongW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG) -> LONG ---
+ GetWindowLongW :: proc(hWnd: HWND, nIndex: INT) -> LONG ---
+ SetWindowLongW :: proc(hWnd: HWND, nIndex: INT, dwNewLong: LONG) -> LONG ---
- GetClassNameW :: proc(hWnd: HWND, lpClassName: LPWSTR, nMaxCount: c_int) -> c_int ---
+ GetClassNameW :: proc(hWnd: HWND, lpClassName: LPWSTR, nMaxCount: INT) -> INT ---
RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM ---
RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM ---
@@ -26,10 +26,10 @@ foreign user32 {
lpClassName: LPCWSTR,
lpWindowName: LPCWSTR,
dwStyle: DWORD,
- X: c_int,
- Y: c_int,
- nWidth: c_int,
- nHeight: c_int,
+ X: INT,
+ Y: INT,
+ nWidth: INT,
+ nHeight: INT,
hWndParent: HWND,
hMenu: HMENU,
hInstance: HINSTANCE,
@@ -38,24 +38,33 @@ foreign user32 {
DestroyWindow :: proc(hWnd: HWND) -> BOOL ---
- ShowWindow :: proc(hWnd: HWND, nCmdShow: c_int) -> BOOL ---
+ ShowWindow :: proc(hWnd: HWND, nCmdShow: INT) -> BOOL ---
IsWindow :: proc(hWnd: HWND) -> BOOL ---
+ IsWindowVisible :: proc(hwnd: HWND) -> BOOL ---
+ IsWindowEnabled :: proc(hwnd: HWND) -> BOOL ---
+ IsIconic :: proc(hwnd: HWND) -> BOOL ---
BringWindowToTop :: proc(hWnd: HWND) -> BOOL ---
GetTopWindow :: proc(hWnd: HWND) -> HWND ---
SetForegroundWindow :: proc(hWnd: HWND) -> BOOL ---
GetForegroundWindow :: proc() -> HWND ---
+ GetDesktopWindow :: proc() -> HWND ---
UpdateWindow :: proc(hWnd: HWND) -> BOOL ---
SetActiveWindow :: proc(hWnd: HWND) -> HWND ---
GetActiveWindow :: proc() -> HWND ---
RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL ---
-
+ SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND ---
+ SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL ---
+ GetPropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE ---
+ RemovePropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE ---
+ EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT ---
+ EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT ---
GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> BOOL ---
TranslateMessage :: proc(lpMsg: ^MSG) -> BOOL ---
DispatchMessageW :: proc(lpMsg: ^MSG) -> LRESULT ---
WaitMessage :: proc() -> BOOL ---
- MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: ^HANDLE, fWaitAll: bool, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD ---
+ MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: ^HANDLE, fWaitAll: BOOL, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD ---
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 ---
@@ -68,7 +77,7 @@ foreign user32 {
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) ---
+ PostQuitMessage :: proc(nExitCode: INT) ---
GetQueueStatus :: proc(flags: UINT) -> DWORD ---
@@ -82,33 +91,26 @@ foreign user32 {
LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON ---
LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON ---
+ GetIconInfoExW :: proc(hIcon: HICON, piconinfo: PICONINFOEXW) -> BOOL ---
LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR ---
LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR ---
- LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx: c_int, cy: c_int, fuLoad: UINT) -> HANDLE ---
+ LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE ---
- CreateIcon :: proc(hInstance: HINSTANCE, nWidth: c_int, nHeight: c_int, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON ---
+ CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON ---
CreateIconFromResource :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD) -> HICON ---
DestroyIcon :: proc(hIcon: HICON) -> BOOL ---
- DrawIcon :: proc(hDC: HDC, X: c_int, Y: c_int, hIcon: HICON) -> BOOL ---
+ DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL ---
- CreateCursor :: proc(hInst: HINSTANCE, xHotSpot: c_int, yHotSpot: c_int, nWidth: c_int, nHeight: c_int, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR ---
+ CreateCursor :: proc(hInst: HINSTANCE, xHotSpot, yHotSpot, nWidth, nHeight: INT, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR ---
DestroyCursor :: proc(hCursor: HCURSOR) -> BOOL ---
GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL ---
GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL ---
ClientToScreen :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL ---
ScreenToClient :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL ---
- SetWindowPos :: proc(
- hWnd: HWND,
- hWndInsertAfter: HWND,
- X: c_int,
- Y: c_int,
- cx: c_int,
- cy: c_int,
- uFlags: UINT,
- ) -> BOOL ---
- MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: c_int, bRepaint: BOOL) -> BOOL ---
- GetSystemMetrics :: proc(nIndex: c_int) -> c_int ---
+ SetWindowPos :: proc(hWnd: HWND, hWndInsertAfter: HWND, X, Y, cx, cy: INT, uFlags: UINT) -> BOOL ---
+ MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: INT, bRepaint: BOOL) -> BOOL ---
+ GetSystemMetrics :: proc(nIndex: INT) -> INT ---
AdjustWindowRect :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL) -> BOOL ---
AdjustWindowRectEx :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD) -> BOOL ---
AdjustWindowRectExForDpi :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD, dpi: UINT) -> BOOL ---
@@ -118,18 +120,36 @@ foreign user32 {
GetWindowDC :: proc(hWnd: HWND) -> HDC ---
GetDC :: proc(hWnd: HWND) -> HDC ---
- ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> c_int ---
+ GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC ---
+ ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT ---
- GetDlgCtrlID :: proc(hWnd: HWND) -> c_int ---
- GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: c_int) -> HWND ---
+ GetDlgCtrlID :: proc(hWnd: HWND) -> INT ---
+ GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND ---
+ CreateMenu :: proc() -> HMENU ---
CreatePopupMenu :: proc() -> HMENU ---
+ DeleteMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL ---
DestroyMenu :: proc(hMenu: HMENU) -> BOOL ---
+ InsertMenuW :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL ---
AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL ---
+ GetMenu :: proc(hWnd: HWND) -> HMENU ---
SetMenu :: proc(hWnd: HWND, hMenu: HMENU) -> BOOL ---
- TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x: int, y: int, nReserved: int, hWnd: HWND, prcRect: ^RECT) -> i32 ---
+ TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> BOOL ---
RegisterWindowMessageW :: proc(lpString: LPCWSTR) -> UINT ---
+ CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: INT) -> HACCEL ---
+ DestroyAcceleratorTable :: proc(hAccel: HACCEL) -> BOOL ---
+ LoadAcceleratorsW :: proc(hInstance: HINSTANCE, lpTableName: LPCWSTR) -> HACCEL ---
+ TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> INT ---
+ CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> INT ---
+
+ InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL ---
+ GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL ---
+ SetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPositon: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL ---
+ GetMenuDefaultItem :: proc(hMenu: HMENU, fByPos: UINT, gmdiFlags: UINT) -> UINT ---
+ SetMenuDefaultItem :: proc(hMenu: HMENU, uItem: UINT, fByPos: UINT) -> BOOL ---
+ GetMenuItemRect :: proc(hWnd: HWND, hMenu: HMENU, uItem: UINT, lprcItem: LPRECT) -> c_int ---
+
GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL ---
ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL ---
InvalidateRect :: proc(hWnd: HWND, lpRect: ^RECT, bErase: BOOL) -> BOOL ---
@@ -142,34 +162,35 @@ foreign user32 {
ReleaseCapture :: proc() -> BOOL ---
TrackMouseEvent :: proc(lpEventTrack: LPTRACKMOUSEEVENT) -> BOOL ---
- GetKeyState :: proc(nVirtKey: c_int) -> SHORT ---
- GetAsyncKeyState :: proc(vKey: c_int) -> SHORT ---
+ GetKeyState :: proc(nVirtKey: INT) -> SHORT ---
+ GetAsyncKeyState :: proc(vKey: INT) -> SHORT ---
GetKeyboardState :: proc(lpKeyState: PBYTE) -> BOOL ---
MapVirtualKeyW :: proc(uCode: UINT, uMapType: UINT) -> UINT ---
- ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: c_int, wFlags: UINT) -> c_int ---
+ ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: INT, wFlags: UINT) -> INT ---
- SetWindowsHookExW :: proc(idHook: c_int, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK ---
+ SetWindowsHookExW :: proc(idHook: INT, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK ---
UnhookWindowsHookEx :: proc(hhk: HHOOK) -> BOOL ---
- CallNextHookEx :: proc(hhk: HHOOK, nCode: c_int, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
+ CallNextHookEx :: proc(hhk: HHOOK, nCode: INT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
SetTimer :: proc(hWnd: HWND, nIDEvent: UINT_PTR, uElapse: UINT, lpTimerFunc: TIMERPROC) -> UINT_PTR ---
KillTimer :: proc(hWnd: HWND, uIDEvent: UINT_PTR) -> BOOL ---
- // MessageBoxA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT) -> c_int ---
- MessageBoxW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT) -> c_int ---
- // MessageBoxExA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT, wLanguageId: WORD) -> c_int ---
- MessageBoxExW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT, wLanguageId: WORD) -> c_int ---
+ // MessageBoxA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT) -> INT ---
+ MessageBoxW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT) -> INT ---
+ // MessageBoxExA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT, wLanguageId: WORD) -> INT ---
+ MessageBoxExW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT, wLanguageId: WORD) -> INT ---
ClipCursor :: proc(lpRect: LPRECT) -> BOOL ---
GetCursorPos :: proc(lpPoint: LPPOINT) -> BOOL ---
- SetCursorPos :: proc(X: c_int, Y: c_int) -> BOOL ---
+ SetCursorPos :: proc(X, Y: INT) -> BOOL ---
SetCursor :: proc(hCursor: HCURSOR) -> HCURSOR ---
when !intrinsics.is_package_imported("raylib") {
ShowCursor :: proc(bShow: BOOL) -> INT ---
}
+ EnumDisplayDevicesW :: proc (lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL ---
EnumDisplaySettingsW :: proc(lpszDeviceName: LPCWSTR, iModeNum: DWORD, lpDevMode: ^DEVMODEW) -> BOOL ---
MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR ---
@@ -179,6 +200,9 @@ foreign user32 {
EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL ---
+ IsProcessDPIAware :: proc() -> BOOL ---
+ SetProcessDPIAware :: proc() -> BOOL ---
+
SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT ---
GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT ---
GetWindowDpiAwarenessContext :: proc(hwnd: HWND) -> DPI_AWARENESS_CONTEXT ---
@@ -213,14 +237,14 @@ foreign user32 {
lpdwResult: PDWORD_PTR,
) -> LRESULT ---
- GetSysColor :: proc(nIndex: c_int) -> DWORD ---
- GetSysColorBrush :: proc(nIndex: c_int) -> HBRUSH ---
- SetSysColors :: proc(cElements: c_int, lpaElements: ^INT, lpaRgbValues: ^COLORREF) -> BOOL ---
+ GetSysColor :: proc(nIndex: INT) -> DWORD ---
+ GetSysColorBrush :: proc(nIndex: INT) -> HBRUSH ---
+ SetSysColors :: proc(cElements: INT, lpaElements: ^INT, lpaRgbValues: ^COLORREF) -> BOOL ---
MessageBeep :: proc(uType: UINT) -> BOOL ---
IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL ---
- GetWindowTextLengthW :: proc(hWnd: HWND) -> c_int ---
- GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: c_int) -> c_int ---
+ GetWindowTextLengthW :: proc(hWnd: HWND) -> INT ---
+ GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT ---
SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL ---
CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL ---
@@ -233,12 +257,20 @@ foreign user32 {
GetRegisteredRawInputDevices :: proc(pRawInputDevices: PRAWINPUTDEVICE, puiNumDevices: PUINT, cbSize: UINT) -> UINT ---
RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL ---
- SendInput :: proc(cInputs: UINT, pInputs: [^]INPUT, cbSize: c_int) -> UINT ---
+ SendInput :: proc(cInputs: UINT, pInputs: [^]INPUT, cbSize: INT) -> UINT ---
SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL ---
FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int ---
- EqualRect :: proc(lprc1: ^RECT, lprc2: ^RECT) -> BOOL ---
+ EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL ---
+ OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL ---
+ InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL ---
+ IntersectRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL ---
+ SubtractRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL ---
+ UnionRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL ---
+ IsRectEmpty :: proc(lprc: ^RECT) -> BOOL ---
+ SetRectEmpty :: proc(lprc: ^RECT) -> BOOL ---
+ CopyRect :: proc(lprcDst, lprcSrc: ^RECT) -> BOOL ---
GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL ---
GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL ---
@@ -249,19 +281,30 @@ foreign user32 {
GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU ---
EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL ---
+ MenuItemFromPoint :: proc(hWnd: HWND, hMenu: HMENU, ptScreen: POINT) -> INT ---
DrawTextW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat) -> INT ---
DrawTextExW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat, lpdtp: PDRAWTEXTPARAMS) -> INT ---
+
+ GetLocaleInfoEx :: proc(lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: INT) -> INT ---
+ IsValidLocaleName :: proc(lpLocaleName: LPCWSTR) -> BOOL ---
+ ResolveLocaleName :: proc(lpNameToResolve: LPCWSTR, lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT ---
+ IsValidCodePage :: proc(CodePage: UINT) -> BOOL ---
+ GetACP :: proc() -> CODEPAGE ---
+ GetCPInfoExW :: proc(CodePage: CODEPAGE, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL ---
+
+ GetProcessWindowStation :: proc() -> HWINSTA ---
+ GetUserObjectInformationW :: proc(hObj: HANDLE, nIndex: GetUserObjectInformationFlags, pvInfo: PVOID, nLength: DWORD, lpnLengthNeeded: LPDWORD) -> BOOL ---
}
CreateWindowW :: #force_inline proc "system" (
lpClassName: LPCTSTR,
lpWindowName: LPCTSTR,
dwStyle: DWORD,
- X: c_int,
- Y: c_int,
- nWidth: c_int,
- nHeight: c_int,
+ X: INT,
+ Y: INT,
+ nWidth: INT,
+ nHeight: INT,
hWndParent: HWND,
hMenu: HMENU,
hInstance: HINSTANCE,
@@ -286,11 +329,11 @@ CreateWindowW :: #force_inline proc "system" (
when ODIN_ARCH == .amd64 {
@(default_calling_convention="system")
foreign user32 {
- GetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int) -> ULONG_PTR ---
- SetClassLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> ULONG_PTR ---
+ GetClassLongPtrW :: proc(hWnd: HWND, nIndex: INT) -> ULONG_PTR ---
+ SetClassLongPtrW :: proc(hWnd: HWND, nIndex: INT, dwNewLong: LONG_PTR) -> ULONG_PTR ---
- GetWindowLongPtrW :: proc(hWnd: HWND, nIndex: c_int) -> LONG_PTR ---
- SetWindowLongPtrW :: proc(hWnd: HWND, nIndex: c_int, dwNewLong: LONG_PTR) -> LONG_PTR ---
+ GetWindowLongPtrW :: proc(hWnd: HWND, nIndex: INT) -> LONG_PTR ---
+ SetWindowLongPtrW :: proc(hWnd: HWND, nIndex: INT, dwNewLong: LONG_PTR) -> LONG_PTR ---
}
} else when ODIN_ARCH == .i386 {
GetClassLongPtrW :: GetClassLongW
@@ -300,8 +343,8 @@ when ODIN_ARCH == .amd64 {
SetWindowLongPtrW :: SetWindowLongW
}
-GET_SC_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_int {
- return c_int(wParam) & 0xFFF0
+GET_SC_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> INT {
+ return INT(wParam) & 0xFFF0
}
GET_WHEEL_DELTA_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_short {
@@ -500,8 +543,8 @@ WINDOWPLACEMENT :: struct {
flags: UINT,
showCmd: UINT,
ptMinPosition: POINT,
- ptMaxPosition: POINT,
- rcNormalPosition: RECT,
+ ptMaxPosition: POINT,
+ rcNormalPosition: RECT,
}
WINDOWINFO :: struct {
@@ -519,10 +562,10 @@ WINDOWINFO :: struct {
PWINDOWINFO :: ^WINDOWINFO
DRAWTEXTPARAMS :: struct {
- cbSize: UINT,
- iTabLength: int,
- iLeftMargin: int,
- iRightMargin: int,
+ cbSize : UINT,
+ iTabLength: INT,
+ iLeftMargin: INT,
+ iRightMargin: INT,
uiLengthDrawn: UINT,
}
PDRAWTEXTPARAMS :: ^DRAWTEXTPARAMS
@@ -568,3 +611,95 @@ RedrawWindowFlags :: enum UINT {
RDW_FRAME = 0x0400,
RDW_NOFRAME = 0x0800,
}
+
+GetUserObjectInformationFlags :: enum INT {
+ UOI_FLAGS = 1,
+ UOI_NAME = 2,
+ UOI_TYPE = 3,
+ UOI_USER_SID = 4,
+ UOI_HEAPSIZE = 5,
+ UOI_IO = 6,
+ UOI_TIMERPROC_EXCEPTION_SUPPRESSION = 7,
+}
+
+USEROBJECTFLAGS :: struct {
+ fInherit: BOOL,
+ fReserved: BOOL,
+ dwFlags: DWORD,
+}
+
+PROPENUMPROCW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE) -> BOOL
+PROPENUMPROCEXW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE, unnamedParam4: ULONG_PTR) -> BOOL
+
+RT_CURSOR :: LPWSTR(uintptr(0x00000001))
+RT_BITMAP :: LPWSTR(uintptr(0x00000002))
+RT_ICON :: LPWSTR(uintptr(0x00000003))
+RT_MENU :: LPWSTR(uintptr(0x00000004))
+RT_DIALOG :: LPWSTR(uintptr(0x00000005))
+RT_STRING :: LPWSTR(uintptr(0x00000006))
+RT_FONTDIR :: LPWSTR(uintptr(0x00000007))
+RT_FONT :: LPWSTR(uintptr(0x00000008))
+RT_ACCELERATOR :: LPWSTR(uintptr(0x00000009))
+RT_RCDATA :: LPWSTR(uintptr(0x0000000A))
+RT_MESSAGETABLE :: LPWSTR(uintptr(0x0000000B))
+RT_GROUP_CURSOR :: LPWSTR(uintptr(0x0000000C))
+RT_GROUP_ICON :: LPWSTR(uintptr(0x0000000E))
+RT_VERSION :: LPWSTR(uintptr(0x00000010))
+RT_DLGINCLUDE :: LPWSTR(uintptr(0x00000011))
+RT_PLUGPLAY :: LPWSTR(uintptr(0x00000013))
+RT_VXD :: LPWSTR(uintptr(0x00000014))
+RT_ANICURSOR :: LPWSTR(uintptr(0x00000015))
+RT_ANIICON :: LPWSTR(uintptr(0x00000016))
+RT_MANIFEST :: LPWSTR(uintptr(0x00000018))
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000001))
+ISOLATIONAWARE_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000002))
+ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000003))
+ISOLATIONPOLICY_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000004))
+ISOLATIONPOLICY_BROWSER_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000005))
+MINIMUM_RESERVED_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000001))
+MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000010))
+
+ACCEL :: struct {
+ /* Also called the flags field */
+ fVirt: BYTE,
+ key: WORD,
+ cmd: WORD,
+}
+LPACCEL :: ^ACCEL
+
+MIIM_STATE :: 0x00000001
+MIIM_ID :: 0x00000002
+MIIM_SUBMENU :: 0x00000004
+MIIM_CHECKMARKS :: 0x00000008
+MIIM_TYPE :: 0x00000010
+MIIM_DATA :: 0x00000020
+
+MIIM_STRING :: 0x00000040
+MIIM_BITMAP :: 0x00000080
+MIIM_FTYPE :: 0x00000100
+
+MENUITEMINFOW :: struct {
+ cbSize: UINT,
+ fMask: UINT,
+ fType: UINT, // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
+ fState: UINT, // used if MIIM_STATE
+ wID: UINT, // used if MIIM_ID
+ hSubMenu: HMENU, // used if MIIM_SUBMENU
+ hbmpChecked: HBITMAP, // used if MIIM_CHECKMARKS
+ hbmpUnchecked: HBITMAP, // used if MIIM_CHECKMARKS
+ dwItemData: ULONG_PTR, // used if MIIM_DATA
+ dwTypeData: LPWSTR, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
+ cch: UINT, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
+ hbmpItem: HBITMAP, // used if MIIM_BITMAP
+}
+LPMENUITEMINFOW :: ^MENUITEMINFOW
+DISPLAY_DEVICEW :: struct {
+ cb: DWORD,
+ DeviceName: [32]WCHAR,
+ DeviceString: [128]WCHAR,
+ StateFlags: DWORD,
+ DeviceID: [128]WCHAR,
+ DeviceKey: [128]WCHAR,
+}
+PDISPLAY_DEVICEW :: ^DISPLAY_DEVICEW
diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin
index c68d58de0..3b76de1da 100644
--- a/core/sys/windows/util.odin
+++ b/core/sys/windows/util.odin
@@ -6,22 +6,79 @@ import "base:intrinsics"
L :: intrinsics.constant_utf16_cstring
-LOWORD :: #force_inline proc "contextless" (x: DWORD) -> WORD {
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/makeword
+MAKEWORD :: #force_inline proc "contextless" (#any_int a, b: int) -> WORD {
+ return WORD(BYTE(DWORD_PTR(a) & 0xff)) | (WORD(BYTE(DWORD_PTR(b) & 0xff)) << 8)
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/makelong
+MAKELONG :: #force_inline proc "contextless" (#any_int a, b: int) -> LONG {
+ return LONG(WORD(DWORD_PTR(a) & 0xffff)) | (LONG(WORD(DWORD_PTR(b) & 0xffff)) << 16)
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/loword
+LOWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD {
return WORD(x & 0xffff)
}
-HIWORD :: #force_inline proc "contextless" (x: DWORD) -> WORD {
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/hiword
+HIWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD {
return WORD(x >> 16)
}
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/lobyte
+LOBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE {
+ return BYTE((DWORD_PTR(w)) & 0xff)
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/winmsg/hibyte
+HIBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE {
+ return BYTE(((DWORD_PTR(w)) >> 8) & 0xff)
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makewparam
+MAKEWPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> WPARAM {
+ return WPARAM(MAKELONG(l, h))
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelparam
+MAKELPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> LPARAM {
+ return LPARAM(MAKELONG(l, h))
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelresult
+MAKELRESULT :: #force_inline proc "contextless" (#any_int l, h: int) -> LRESULT {
+ return LRESULT(MAKELONG(l, h))
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_x_lparam
GET_X_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int {
return cast(c_int)cast(c_short)LOWORD(cast(DWORD)lp)
}
+// https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_y_lparam
GET_Y_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int {
return cast(c_int)cast(c_short)HIWORD(cast(DWORD)lp)
}
+// https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelcid
+MAKELCID :: #force_inline proc "contextless" (lgid, srtid: WORD) -> LCID {
+ return (DWORD(WORD(srtid)) << 16) | DWORD(WORD(lgid))
+}
+
+// https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelangid
+MAKELANGID :: #force_inline proc "contextless" (p, s: WORD) -> DWORD {
+ return DWORD(WORD(s)) << 10 | DWORD(WORD(p))
+}
+
+LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID {
+ return LANGID(lcid)
+}
+
+// this one gave me trouble as it do not mask the values.
+// the _ in the name is also off comparing to the c code
+// i can't find any usage in the odin repo
+@(deprecated = "use MAKEWORD")
MAKE_WORD :: #force_inline proc "contextless" (x, y: WORD) -> WORD {
return x << 8 | y
}
diff --git a/core/sys/windows/winerror.odin b/core/sys/windows/winerror.odin
index 118327ffa..f99a90d4f 100644
--- a/core/sys/windows/winerror.odin
+++ b/core/sys/windows/winerror.odin
@@ -1,6 +1,189 @@
// +build windows
package sys_windows
+// https://learn.microsoft.com/en-us/windows/win32/api/winerror/
+
+// Values are 32 bit values laid out as follows:
+//
+// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+// +---+-+-+-----------------------+-------------------------------+
+// |Sev|C|R| Facility | Code |
+// +---+-+-+-----------------------+-------------------------------+
+//
+// where
+//
+// Sev - is the severity code
+//
+// 00 - Success
+// 01 - Informational
+// 10 - Warning
+// 11 - Error
+//
+// C - is the Customer code flag
+//
+// R - is a reserved bit
+//
+// Facility - is the facility code
+//
+// Code - is the facility's status code
+
+// Define the facility codes
+FACILITY :: enum DWORD {
+ NULL = 0,
+ RPC = 1,
+ DISPATCH = 2,
+ STORAGE = 3,
+ ITF = 4,
+ WIN32 = 7,
+ WINDOWS = 8,
+ SSPI = 9,
+ SECURITY = 9,
+ CONTROL = 10,
+ CERT = 11,
+ INTERNET = 12,
+ MEDIASERVER = 13,
+ MSMQ = 14,
+ SETUPAPI = 15,
+ SCARD = 16,
+ COMPLUS = 17,
+ AAF = 18,
+ URT = 19,
+ ACS = 20,
+ DPLAY = 21,
+ UMI = 22,
+ SXS = 23,
+ WINDOWS_CE = 24,
+ HTTP = 25,
+ USERMODE_COMMONLOG = 26,
+ WER = 27,
+ USERMODE_FILTER_MANAGER = 31,
+ BACKGROUNDCOPY = 32,
+ CONFIGURATION = 33,
+ WIA = 33,
+ STATE_MANAGEMENT = 34,
+ METADIRECTORY = 35,
+ WINDOWSUPDATE = 36,
+ DIRECTORYSERVICE = 37,
+ GRAPHICS = 38,
+ SHELL = 39,
+ NAP = 39,
+ TPM_SERVICES = 40,
+ TPM_SOFTWARE = 41,
+ UI = 42,
+ XAML = 43,
+ ACTION_QUEUE = 44,
+ PLA = 48,
+ WINDOWS_SETUP = 48,
+ FVE = 49,
+ FWP = 50,
+ WINRM = 51,
+ NDIS = 52,
+ USERMODE_HYPERVISOR = 53,
+ CMI = 54,
+ USERMODE_VIRTUALIZATION = 55,
+ USERMODE_VOLMGR = 56,
+ BCD = 57,
+ USERMODE_VHD = 58,
+ USERMODE_HNS = 59,
+ SDIAG = 60,
+ WEBSERVICES = 61,
+ WINPE = 61,
+ WPN = 62,
+ WINDOWS_STORE = 63,
+ INPUT = 64,
+ QUIC = 65,
+ EAP = 66,
+ IORING = 70,
+ WINDOWS_DEFENDER = 80,
+ OPC = 81,
+ XPS = 82,
+ MBN = 84,
+ POWERSHELL = 84,
+ RAS = 83,
+ P2P_INT = 98,
+ P2P = 99,
+ DAF = 100,
+ BLUETOOTH_ATT = 101,
+ AUDIO = 102,
+ STATEREPOSITORY = 103,
+ VISUALCPP = 109,
+ SCRIPT = 112,
+ PARSE = 113,
+ BLB = 120,
+ BLB_CLI = 121,
+ WSBAPP = 122,
+ BLBUI = 128,
+ USN = 129,
+ USERMODE_VOLSNAP = 130,
+ TIERING = 131,
+ WSB_ONLINE = 133,
+ ONLINE_ID = 134,
+ DEVICE_UPDATE_AGENT = 135,
+ DRVSERVICING = 136,
+ DLS = 153,
+ DELIVERY_OPTIMIZATION = 208,
+ USERMODE_SPACES = 231,
+ USER_MODE_SECURITY_CORE = 232,
+ USERMODE_LICENSING = 234,
+ SOS = 160,
+ OCP_UPDATE_AGENT = 173,
+ DEBUGGERS = 176,
+ SPP = 256,
+ RESTORE = 256,
+ DMSERVER = 256,
+ DEPLOYMENT_SERVICES_SERVER = 257,
+ DEPLOYMENT_SERVICES_IMAGING = 258,
+ DEPLOYMENT_SERVICES_MANAGEMENT = 259,
+ DEPLOYMENT_SERVICES_UTIL = 260,
+ DEPLOYMENT_SERVICES_BINLSVC = 261,
+ DEPLOYMENT_SERVICES_PXE = 263,
+ DEPLOYMENT_SERVICES_TFTP = 264,
+ DEPLOYMENT_SERVICES_TRANSPORT_MANAGEMENT = 272,
+ DEPLOYMENT_SERVICES_DRIVER_PROVISIONING = 278,
+ DEPLOYMENT_SERVICES_MULTICAST_SERVER = 289,
+ DEPLOYMENT_SERVICES_MULTICAST_CLIENT = 290,
+ DEPLOYMENT_SERVICES_CONTENT_PROVIDER = 293,
+ HSP_SERVICES = 296,
+ HSP_SOFTWARE = 297,
+ LINGUISTIC_SERVICES = 305,
+ AUDIOSTREAMING = 1094,
+ TTD = 1490,
+ ACCELERATOR = 1536,
+ WMAAECMA = 1996,
+ DIRECTMUSIC = 2168,
+ DIRECT3D10 = 2169,
+ DXGI = 2170,
+ DXGI_DDI = 2171,
+ DIRECT3D11 = 2172,
+ DIRECT3D11_DEBUG = 2173,
+ DIRECT3D12 = 2174,
+ DIRECT3D12_DEBUG = 2175,
+ DXCORE = 2176,
+ PRESENTATION = 2177,
+ LEAP = 2184,
+ AUDCLNT = 2185,
+ WINCODEC_DWRITE_DWM = 2200,
+ WINML = 2192,
+ DIRECT2D = 2201,
+ DEFRAG = 2304,
+ USERMODE_SDBUS = 2305,
+ JSCRIPT = 2306,
+ PIDGENX = 2561,
+ EAS = 85,
+ WEB = 885,
+ WEB_SOCKET = 886,
+ MOBILE = 1793,
+ SQLITE = 1967,
+ SERVICE_FABRIC = 1968,
+ UTC = 1989,
+ WEP = 2049,
+ SYNCENGINE = 2050,
+ XBOX = 2339,
+ GAME = 2340,
+ PIX = 2748,
+}
+
ERROR_SUCCESS : DWORD : 0
NO_ERROR :: 0
SEC_E_OK : HRESULT : 0x00000000
@@ -42,14 +225,55 @@ ERROR_TIMEOUT : DWORD : 1460
ERROR_DATATYPE_MISMATCH : DWORD : 1629
ERROR_UNSUPPORTED_TYPE : DWORD : 1630
ERROR_NOT_SAME_OBJECT : DWORD : 1656
-ERROR_PIPE_CONNECTED : DWORD : 0x80070217
+ERROR_PIPE_CONNECTED : DWORD : 535
ERROR_PIPE_BUSY : DWORD : 231
-E_NOTIMPL :: HRESULT(-0x7fff_bfff) // 0x8000_4001
+// https://learn.microsoft.com/en-us/windows/win32/seccrypto/common-hresult-values
+S_OK :: 0x00000000 // Operation successful
+E_NOTIMPL :: 0x80004001 // Not implemented
+E_NOINTERFACE :: 0x80004002 // No such interface supported
+E_POINTER :: 0x80004003 // Pointer that is not valid
+E_ABORT :: 0x80004004 // Operation aborted
+E_FAIL :: 0x80004005 // Unspecified failure
+E_UNEXPECTED :: 0x8000FFFF // Unexpected failure
+E_ACCESSDENIED :: 0x80070005 // General access denied error
+E_HANDLE :: 0x80070006 // Handle that is not valid
+E_OUTOFMEMORY :: 0x8007000E // Failed to allocate necessary memory
+E_INVALIDARG :: 0x80070057 // One or more arguments are not valid
+
+// Severity values
+SEVERITY :: enum DWORD {
+ SUCCESS = 0,
+ ERROR = 1,
+}
+
+// Generic test for success on any status value (non-negative numbers indicate success).
+SUCCEEDED :: #force_inline proc(#any_int result: int) -> bool { return result >= S_OK }
+// and the inverse
+FAILED :: #force_inline proc(#any_int result: int) -> bool { return result < S_OK }
-SUCCEEDED :: #force_inline proc(#any_int result: int) -> bool { return result >= 0 }
+// Generic test for error on any status value.
+IS_ERROR :: #force_inline proc(#any_int status: int) -> bool { return u32(status) >> 31 == u32(SEVERITY.ERROR) }
+// Return the code
+HRESULT_CODE :: #force_inline proc(#any_int hr: int) -> int { return int(u32(hr) & 0xFFFF) }
+
+// Return the facility
+HRESULT_FACILITY :: #force_inline proc(#any_int hr: int) -> FACILITY { return FACILITY((u32(hr) >> 16) & 0x1FFF) }
+
+// Return the severity
+HRESULT_SEVERITY :: #force_inline proc(#any_int hr: int) -> SEVERITY { return SEVERITY((u32(hr) >> 31) & 0x1) }
+
+// Create an HRESULT value from component pieces
+MAKE_HRESULT :: #force_inline proc(#any_int sev: int, #any_int fac: int, #any_int code: int) -> HRESULT {
+ return HRESULT((uint(sev)<<31) | (uint(fac)<<16) | (uint(code)))
+}
+
+DECODE_HRESULT :: #force_inline proc(#any_int hr: int) -> (SEVERITY, FACILITY, int) {
+ return HRESULT_SEVERITY(hr), HRESULT_FACILITY(hr), HRESULT_CODE(hr)
+}
+// aka ERROR or WIN32_ERROR to hint the WIN32 facility
System_Error :: enum DWORD {
// The operation completed successfully.
SUCCESS = 0x0,
diff --git a/core/sys/windows/winmm.odin b/core/sys/windows/winmm.odin
index 8ddef29c0..a1786c27a 100644
--- a/core/sys/windows/winmm.odin
+++ b/core/sys/windows/winmm.odin
@@ -270,7 +270,7 @@ LPHWAVEOUT :: ^HWAVEOUT
// https://learn.microsoft.com/en-us/windows/win32/multimedia/multimedia-timer-structures
MMTIME :: struct {
- wType: UINT,
+ wType: MMTIME_TYPE,
u: struct #raw_union {
ms: DWORD,
sample: DWORD,
@@ -292,6 +292,21 @@ MMTIME :: struct {
}
LPMMTIME :: ^MMTIME
+MMTIME_TYPE :: enum UINT {
+ /* time in milliseconds */
+ TIME_MS = 0x0001,
+ /* number of wave samples */
+ TIME_SAMPLES = 0x0002,
+ /* current byte offset */
+ TIME_BYTES = 0x0004,
+ /* SMPTE time */
+ TIME_SMPTE = 0x0008,
+ /* MIDI time */
+ TIME_MIDI = 0x0010,
+ /* Ticks within MIDI stream */
+ TIME_TICKS = 0x0020,
+}
+
MAXPNAMELEN :: 32
MAXERRORLENGTH :: 256
MMVERSION :: UINT
diff --git a/core/sys/windows/winnls.odin b/core/sys/windows/winnls.odin
new file mode 100644
index 000000000..292d2fad2
--- /dev/null
+++ b/core/sys/windows/winnls.odin
@@ -0,0 +1,31 @@
+// +build windows
+package sys_windows
+
+LCTYPE :: distinct DWORD
+
+LOCALE_NAME_MAX_LENGTH :: 85
+LOCALE_NAME_USER_DEFAULT :: 0
+LOCALE_NAME_INVARIANT : wstring = L("")
+LOCALE_NAME_SYSTEM_DEFAULT : wstring = L("!x-sys-default-locale")
+
+// String Length Maximums.
+// 5 ranges, 2 bytes ea., 0 term.
+MAX_LEADBYTES :: 12
+// single or double byte
+MAX_DEFAULTCHAR :: 2
+
+CPINFOEXW :: struct{
+ // Maximum length, in bytes, of a character in the code page.
+ MaxCharSize: UINT,
+ // The default is usually the "?" character for the code page.
+ DefaultChar: [MAX_DEFAULTCHAR]BYTE,
+ // A fixed-length array of lead byte ranges, for which the number of lead byte ranges is variable.
+ LeadByte: [MAX_LEADBYTES]BYTE,
+ // The default is usually the "?" character or the katakana middle dot character.
+ UnicodeDefaultChar: WCHAR,
+ // Code page value. This value reflects the code page passed to the GetCPInfoEx function.
+ CodePage: CODEPAGE,
+ // Full name of the code page.
+ CodePageName: [MAX_PATH]WCHAR,
+}
+LPCPINFOEXW :: ^CPINFOEXW
diff --git a/core/sys/windows/winver.odin b/core/sys/windows/winver.odin
new file mode 100644
index 000000000..091d53d3a
--- /dev/null
+++ b/core/sys/windows/winver.odin
@@ -0,0 +1,92 @@
+// +build windows
+package sys_windows
+
+foreign import version "system:version.lib"
+
+@(default_calling_convention = "system")
+foreign version {
+ GetFileVersionInfoSizeW :: proc(lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD ---
+ GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL ---
+
+ GetFileVersionInfoSizeExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD ---
+ GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD ---
+
+ VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD ---
+ VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL ---
+}
+
+FILE_VER_GET :: enum DWORD {LOCALISED, NEUTRAL, PREFETCHED}
+FILE_VER_GET_FLAGS :: bit_set[FILE_VER_GET; DWORD]
+
+/* ----- Symbols ----- */
+VS_FILE_INFO :: RT_VERSION
+VS_VERSION_INFO :: 1
+VS_USER_DEFINED :: 100
+
+VS_FFI_SIGNATURE : DWORD : 0xFEEF04BD
+
+VS_FFI_STRUCVERSION :: 0x00010000
+VS_FFI_FILEFLAGSMASK :: 0x0000003F
+
+/* ----- VS_VERSION.dwFileFlags ----- */
+VS_FILEFLAG :: enum DWORD {
+ DEBUG,
+ PRERELEASE,
+ PATCHED,
+ PRIVATEBUILD,
+ INFOINFERRED,
+ SPECIALBUILD,
+}
+VS_FILEFLAGS :: bit_set[VS_FILEFLAG;DWORD]
+
+/* ----- VS_VERSION.dwFileOS ----- */
+VOS :: enum WORD {
+ UNKNOWN = 0x0000,
+ DOS = 0x0001,
+ OS216 = 0x0002,
+ OS232 = 0x0003,
+ NT = 0x0004,
+ WINCE = 0x0005,
+}
+VOS2 :: enum WORD {
+ BASE = 0x0000,
+ WINDOWS16 = 0x0001,
+ PM16 = 0x0002,
+ PM32 = 0x0003,
+ WINDOWS32 = 0x0004,
+}
+
+/* ----- VS_VERSION.dwFileType ----- */
+VFT :: enum DWORD {
+ UNKNOWN = 0x00000000,
+ APP = 0x00000001,
+ DLL = 0x00000002,
+ DRV = 0x00000003,
+ FONT = 0x00000004,
+ VXD = 0x00000005,
+ STATIC_LIB = 0x00000007,
+}
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ----- */
+VFT2_WINDOWS_DRV :: enum DWORD {
+ UNKNOWN = 0x00000000,
+ DRV_PRINTER = 0x00000001,
+ DRV_KEYBOARD = 0x00000002,
+ DRV_LANGUAGE = 0x00000003,
+ DRV_DISPLAY = 0x00000004,
+ DRV_MOUSE = 0x00000005,
+ DRV_NETWORK = 0x00000006,
+ DRV_SYSTEM = 0x00000007,
+ DRV_INSTALLABLE = 0x00000008,
+ DRV_SOUND = 0x00000009,
+ DRV_COMM = 0x0000000A,
+ DRV_INPUTMETHOD = 0x0000000B,
+ DRV_VERSIONED_PRINTER = 0x0000000C,
+}
+
+/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ----- */
+VFT2_WINDOWS_FONT :: enum DWORD {
+ FONT_RASTER = 0x00000001,
+ FONT_VECTOR = 0x00000002,
+ FONT_TRUETYPE = 0x00000003,
+}