From 230c14b24cecd265d18cf3d93b04c6d8c3cab648 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Fri, 18 Sep 2026 21:19:04 +0200 Subject: [PATCH 01/10] Add Win32 Dialog Manager bindings --- core/sys/windows/types.odin | 1 + core/sys/windows/user32.odin | 185 +++++++++++++++++++++++- core/sys/windows/window_messages.odin | 3 - tests/core/sys/windows/test_user32.odin | 6 + 4 files changed, 188 insertions(+), 7 deletions(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 00586e2407f..4f57e6c3bd2 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1865,6 +1865,7 @@ MB_MODEMASK :: 0x00003000 MB_MISCMASK :: 0x0000C000 // Dialog Box Command IDs + IDOK :: 1 IDCANCEL :: 2 IDABORT :: 3 diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 75ed1e91b73..abd76f92c82 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -143,9 +143,6 @@ foreign user32 { GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC --- ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT --- - 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 --- @@ -264,7 +261,6 @@ foreign user32 { 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) -> INT --- GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT --- SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL --- @@ -747,6 +743,7 @@ RT_PLUGPLAY :: LPWSTR(uintptr(0x00000013)) RT_VXD :: LPWSTR(uintptr(0x00000014)) RT_ANICURSOR :: LPWSTR(uintptr(0x00000015)) RT_ANIICON :: LPWSTR(uintptr(0x00000016)) +RT_HTML :: LPWSTR(uintptr(0x00000017)) RT_MANIFEST :: LPWSTR(uintptr(0x00000018)) CREATEPROCESS_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000001)) @@ -1083,3 +1080,183 @@ COPYDATASTRUCT :: struct { } PCOPYDATASTRUCT :: ^COPYDATASTRUCT + +// +// Dialog Manager +// + +DLGPROC :: #type proc "system" (hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> INT_PTR + +DLGTEMPLATE :: struct #packed { + style: DWORD, + dxExtendedStyle: DWORD, + cdit: WORD, + x: c_short, + y: c_short, + c_x: c_short, + c_y: c_short, +} + +// https://learn.microsoft.com/en-us/windows/win32/dlgbox/dlgtemplateex +DLGTEMPLATEEX :: struct #packed { + dlgVer: WORD, + signature: WORD, + helpID: DWORD, + exStyle: DWORD, + style: DWORD, + cDlgItems: WORD, + x: c_short, + y: c_short, + cx: c_short, + cy: c_short, +} + +DLGITEMTEMPLATE :: struct #packed { + style: DWORD, + dwExtendedStyle: DWORD, + x: c_short, + y: c_short, + cx: c_short, + cy: c_short, + id: WORD, +} + +DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS :: enum c_int { + DCDC_DEFAULT = 0x0000, + DCDC_DISABLE_FONT_UPDATE = 0x0001, + DCDC_DISABLE_RELAYOUT = 0x0002, +} + +DIALOG_DPI_CHANGE_BEHAVIORS :: enum c_int { + DDC_DEFAULT = 0x0000, + DDC_DISABLE_ALL = 0x0001, + DDC_DISABLE_RESIZE = 0x0002, + DDC_DISABLE_CONTROL_RELAYOUT = 0x0004, +} + +@(default_calling_convention="system") +foreign user32 { + CreateDialogParamW :: proc(hInstance: HINSTANCE, lpTemplateName: LPCWSTR, hWndParent: HWND, lpDialogFunc: DLGPROC, dwInitParam: LPARAM) -> HWND --- + CreateDialogIndirectParamW :: proc(hInstance: HINSTANCE, lpTemplate: ^DLGTEMPLATE, hWndParent: HWND, lpDialogFunc: DLGPROC, dwInitParam: LPARAM) -> HWND --- + + DialogBoxParamW :: proc(hInstance: HINSTANCE, lpTemplateName: LPCWSTR, hWndParent: HWND, lpDialogFunc: DLGPROC, dwInitParam: LPARAM) -> INT_PTR --- + DialogBoxIndirectParamW :: proc(hInstance: HINSTANCE, hDialogTemplate: ^DLGTEMPLATE, hWndParent: HWND, lpDialogFunc: DLGPROC, dwInitParam: LPARAM) -> INT_PTR --- + + EndDialog :: proc(hDlg: HWND, nResult: INT_PTR) -> BOOL --- + GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND --- + SetDlgItemInt :: proc(hDlg: HWND, nIDDlgItem: c_int, uValue: UINT, bSigned: BOOL) -> BOOL --- + GetDlgItemInt :: proc(hDlg: HWND, nIDDlgItem: c_int, lpTranslated: ^BOOL, bSigned: BOOL) -> UINT --- + SetDlgItemTextW :: proc(hDlg: HWND, nIDDlgItem: c_int, lpString: LPCWSTR) -> BOOL --- + GetDlgItemTextW :: proc(hDlg: HWND, nIDDlgItem: c_int, lpString: LPWSTR, cchMax: c_int) -> UINT --- + CheckDlgButton :: proc(hDlg: HWND, nIDButton: c_int, uCheck: UINT) -> BOOL --- + CheckRadioButton :: proc(hDlg: HWND, nIDFirstButton: c_int, nIDLastButton: c_int, nIDCheckButton: c_int) -> BOOL --- + IsDlgButtonChecked :: proc(hDlg: HWND, nIDButton: c_int) -> UINT --- + SendDlgItemMessageW :: proc(hDlg: HWND, nIDDlgItem: c_int, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + GetNextDlgGroupItem :: proc(hDlg: HWND, hCtl: HWND, bPrevious: BOOL) -> HWND --- + GetNextDlgTabItem :: proc(hDlg: HWND, hCtl: HWND, bPrevious: BOOL) -> HWND --- + GetDlgCtrlID :: proc(hWnd: HWND) -> INT --- + GetDialogBaseUnits :: proc() -> c_long --- + + DefDlgProcA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + DefDlgProcW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + + SetDialogControlDpiChangeBehavior :: proc(hWnd: HWND, mask: DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS, values: DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS) -> BOOL --- + GetDialogControlDpiChangeBehavior :: proc(hWnd: HWND) -> DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS --- + + SetDialogDpiChangeBehavior :: proc(hDlg: HWND, mask: DIALOG_DPI_CHANGE_BEHAVIORS, values: DIALOG_DPI_CHANGE_BEHAVIORS) -> BOOL --- + GetDialogDpiChangeBehavior :: proc(hDlg: HWND) -> DIALOG_DPI_CHANGE_BEHAVIORS --- + + IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL --- + MapDialogRect :: proc(hDlg: HWND, lpRect: LPRECT) -> BOOL --- + + DlgDirListW :: proc(hDlg: HWND, lpPathSpec: LPWSTR, nIDListBox: c_int, nIDStaticPath: c_int, uFileType: UINT) -> c_int --- + DlgDirSelectExW :: proc(hDlg: HWND, lpString: LPWSTR, chCount: c_int, idListBox: c_int) -> BOOL --- + DlgDirListComboBoxW :: proc(hDlg: HWND, lpPathSpec: LPWSTR, nIDComboBox: c_int, nIDStaticPath: c_int, uFileType: UINT) -> c_int --- + DlgDirSelectComboBoxExW :: proc(hDlg: HWND, lpString: LPWSTR, cchOut: c_int, idComboBox: c_int) -> BOOL --- +} + +CreateDialogW :: #force_inline proc "system" (hInstance: HINSTANCE, lpTemplateName: LPCWSTR, hWndParent: HWND, lpDialogFunc: DLGPROC) -> HWND { + return CreateDialogParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, 0) +} + +CreateDialogIndirectW :: #force_inline proc "system" (hInstance: HINSTANCE, lpTemplate: ^DLGTEMPLATE, hWndParent: HWND, lpDialogFunc: DLGPROC) -> HWND { + return CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0) +} + +DialogBoxW :: #force_inline proc "system" (hInstance: HINSTANCE, lpTemplateName: LPCWSTR, hWndParent: HWND, lpDialogFunc: DLGPROC) -> INT_PTR { + return DialogBoxParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, 0) +} + +DialogBoxIndirectW :: #force_inline proc "system" (hInstance: HINSTANCE, hDialogTemplate: ^DLGTEMPLATE, hWndParent: HWND, lpDialogFunc: DLGPROC) -> INT_PTR { + return DialogBoxIndirectParamW(hInstance, hDialogTemplate, hWndParent, lpDialogFunc, 0) +} + +// Window extra bytes (WNDCLASSW.cbWndExtra) needed for private dialog classes. +// +// Interestingly, this does not depend on 32-bit/64-bit. +DLGWINDOWEXTRA :: 30 + +// Dialog window class +WC_DIALOG :: cast(LPWSTR)cast(uintptr)0x8002 + +// Additional `GetWindowLongPtrW`/`SetWindowLongPtrW` constants for dialogs (see Dialog Manager functions). +// These live inside the `DLGWINDOWEXTRA` bytes of the window. + +DWLP_MSGRESULT :: 0 +DWLP_DLGPROC :: DWLP_MSGRESULT + size_of(LRESULT) +DWLP_USER :: DWLP_DLGPROC + size_of(DLGPROC) + +// Dialog Styles + +DS_ABSALIGN :: 0x0001 +DS_SYSMODAL :: 0x0002 +DS_3DLOOK :: 0x0004 +DS_FIXEDSYS :: 0x0008 +DS_NOFAILCREATE :: 0x0010 +DS_LOCALEDIT :: 0x0020 +DS_SETFONT :: 0x0040 +DS_MODALFRAME :: 0x0080 +DS_NOIDLEMSG :: 0x0100 +DS_SETFOREGROUND :: 0x0200 +DS_CONTROL :: 0x0400 +DS_CENTER :: 0x0800 +DS_CENTERMOUSE :: 0x1000 +DS_CONTEXTHELP :: 0x2000 +DS_SHELLFONT :: DS_SETFONT | DS_FIXEDSYS + +// Dialog Messages + +DM_GETDEFID :: WM_USER + 0 +DM_SETDEFID :: WM_USER + 1 +DM_REPOSITION :: WM_USER + 2 + +// Returned in `HIWORD()` of `DM_GETDEFID` result if msg is supported +DC_HASDEFID :: 0x534B + +// Dialog Codes + +DLGC_WANTARROWS :: 0x0001 // Control wants arrow keys +DLGC_WANTTAB :: 0x0002 // Control wants tab keys +DLGC_WANTALLKEYS :: 0x0004 // Control wants all keys +DLGC_WANTMESSAGE :: 0x0004 // Pass message to control +DLGC_HASSETSEL :: 0x0008 // Understands `EM_SETSEL` message +DLGC_DEFPUSHBUTTON :: 0x0010 // Default pushbutton +DLGC_UNDEFPUSHBUTTON :: 0x0020 // Non-default pushbutton +DLGC_RADIOBUTTON :: 0x0040 // Radio button +DLGC_WANTCHARS :: 0x0080 // Want `WM_CHAR` messages +DLGC_STATIC :: 0x0100 // Static item: don't include +DLGC_BUTTON :: 0x2000 // Button item: can be checked + + +// `DlgDirListW`, `DlgDirListComboBoxW` flags values + +DDL_READWRITE :: 0x0000 +DDL_READONLY :: 0x0001 +DDL_HIDDEN :: 0x0002 +DDL_SYSTEM :: 0x0004 +DDL_DIRECTORY :: 0x0010 +DDL_ARCHIVE :: 0x0020 + +DDL_POSTMSGS :: 0x2000 +DDL_DRIVES :: 0x4000 +DDL_EXCLUSIVE :: 0x8000 diff --git a/core/sys/windows/window_messages.odin b/core/sys/windows/window_messages.odin index 90ecbda4a09..58c084bc8f1 100644 --- a/core/sys/windows/window_messages.odin +++ b/core/sys/windows/window_messages.odin @@ -373,13 +373,11 @@ WM_CTLINIT :: 0x0387 WM_PENEVENT :: 0x0388 WM_PENWINLAST :: 0x038f DDM_SETFMT :: 0x0400 -DM_GETDEFID :: 0x0400 NIN_SELECT :: 0x0400 TBM_GETPOS :: 0x0400 WM_USER :: 0x0400 CBEM_INSERTITEMA :: 0x0401 DDM_DRAW :: 0x0401 -DM_SETDEFID :: 0x0401 HKM_SETHOTKEY :: 0x0401 PBM_SETRANGE :: 0x0401 RB_INSERTBANDA :: 0x0401 @@ -390,7 +388,6 @@ TTM_ACTIVATE :: 0x0401 WM_CHOOSEFONT_GETLOGFONT :: 0x0401 CBEM_SETIMAGELIST :: 0x0402 DDM_CLOSE :: 0x0402 -DM_REPOSITION :: 0x0402 HKM_GETHOTKEY :: 0x0402 PBM_SETPOS :: 0x0402 RB_DELETEBAND :: 0x0402 diff --git a/tests/core/sys/windows/test_user32.odin b/tests/core/sys/windows/test_user32.odin index 2fe849a6bbc..8fb900d1fda 100644 --- a/tests/core/sys/windows/test_user32.odin +++ b/tests/core/sys/windows/test_user32.odin @@ -11,3 +11,9 @@ verify_rawinput_code :: proc(t: ^testing.T) { testing.expect_value(t, win32.GET_RAWINPUT_CODE_WPARAM(0x100), win32.RAWINPUT_CODE.RIM_INPUT) testing.expect_value(t, win32.GET_RAWINPUT_CODE_WPARAM(0x101), win32.RAWINPUT_CODE.RIM_INPUTSINK) } + +@(test) +verify_winuser_manual :: proc(t: ^testing.T) { + expect_size(t, win32.DLGTEMPLATE, 18) + expect_size(t, win32.DLGITEMTEMPLATE, 18) +} From d1776153fed787cccd726ada9c6ccb3f5c11640f Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 24 Sep 2026 20:50:24 +0200 Subject: [PATCH 02/10] Add some gdi32 bindings --- core/sys/windows/gdi32.odin | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index b11589d4114..c4a2a086685 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -24,7 +24,14 @@ foreign gdi32 { CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^PVOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: LPVOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- + GetStretchBltMode :: proc(hdc: HDC) -> c_int --- + SetStretchBltMode :: proc(hdc: HDC, mode: c_int) -> c_int --- + GetPixel :: proc(hdc: HDC, x, y: c_int) -> COLORREF --- + SetPixel :: proc(hdc: HDC, x, y: c_int, color: COLORREF) -> COLORREF --- + SetPixelV :: proc(hdc: HDC, x, y: c_int, color: COLORREF) -> BOOL --- + + GetPixelFormat :: proc(hdc: HDC) -> c_int --- 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 --- @@ -67,8 +74,8 @@ foreign gdi32 { SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE --- RealizePalette :: proc(hdc: HDC) -> UINT --- + GetTextColor :: proc(hdc: HDC) -> COLORREF --- SetTextColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - 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 --- @@ -280,6 +287,12 @@ RGN_COPY :: 5 // COLORONCOLOR :: 3 // HALFTONE :: 4 +/* New StretchBlt() Modes */ +STRETCH_ANDSCANS :: BLACKONWHITE +STRETCH_DELETESCANS :: COLORONCOLOR +STRETCH_HALFTONE :: HALFTONE +STRETCH_ORSCANS :: WHITEONBLACK + /* PolyFill() Modes */ ALTERNATE :: 1 WINDING :: 2 From b8f924b1898bd463780b62bdcab97ec82a7dc886 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Fri, 25 Sep 2026 12:30:32 +0200 Subject: [PATCH 03/10] Add HMENU related bindings --- core/sys/windows/types.odin | 23 ---- core/sys/windows/user32.odin | 211 ++++++++++++++++++++++++++++++----- 2 files changed, 180 insertions(+), 54 deletions(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 4f57e6c3bd2..1ab9913f54d 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1516,29 +1516,6 @@ MFS_UNCHECKED :: MF_UNCHECKED MFS_UNHILITE :: MF_UNHILITE MFS_DEFAULT :: MF_DEFAULT -// Flags for TrackPopupMenu -TPM_LEFTBUTTON :: 0x0000 -TPM_RIGHTBUTTON :: 0x0002 -TPM_LEFTALIGN :: 0x0000 -TPM_CENTERALIGN :: 0x0004 -TPM_RIGHTALIGN :: 0x0008 -TPM_TOPALIGN :: 0x0000 -TPM_VCENTERALIGN :: 0x0010 -TPM_BOTTOMALIGN :: 0x0020 - -TPM_HORIZONTAL :: 0x0000 /* Horz alignment matters more */ -TPM_VERTICAL :: 0x0040 /* Vert alignment matters more */ -TPM_NONOTIFY :: 0x0080 /* Don't send any notification msgs */ -TPM_RETURNCMD :: 0x0100 -TPM_RECURSE :: 0x0001 -TPM_HORPOSANIMATION :: 0x0400 -TPM_HORNEGANIMATION :: 0x0800 -TPM_VERPOSANIMATION :: 0x1000 -TPM_VERNEGANIMATION :: 0x2000 -TPM_NOANIMATION :: 0x4000 -TPM_LAYOUTRTL :: 0x8000 -TPM_WORKAREA :: 0x10000 - // WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes HTERROR :: -2 HTTRANSPARENT :: -1 diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index abd76f92c82..948e3b6f6a4 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -145,14 +145,37 @@ foreign user32 { CreateMenu :: proc() -> HMENU --- CreatePopupMenu :: proc() -> HMENU --- + RemoveMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL --- 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 --- + ModifyMenuW :: proc(hMenu: HMENU, uPosition: UINT, 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, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> INT --- + TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: c_int, nReserved: c_int, hWnd: HWND, prcRect: ^RECT) -> BOOL --- + TrackPopupMenuEx :: proc(hMenu: HMENU, uFlags: UINT, x, y: c_int, hwnd: HWND, lptpm: LPTPMPARAMS) -> BOOL --- RegisterWindowMessageW :: proc(lpString: LPCWSTR) -> UINT --- + LoadMenuW :: proc(hInstance: HINSTANCE, lpMenuName: LPCWSTR) -> HMENU --- + LoadMenuIndirectW :: proc(lpMenuTemplate: ^MENUTEMPLATEW) -> HMENU --- + ChangeMenuW :: proc(hMenu: HMENU, cmd: UINT, lpszNewItem: LPCWSTR, cmdInsert: UINT, flags: UINT) -> BOOL --- + HiliteMenuItem :: proc(hWnd: HWND, hMenu: HMENU, uIDHiliteItem: UINT, uHilite: UINT) -> BOOL --- + GetMenuStringW :: proc(hMenu: HMENU, uIDItem: UINT, lpString: LPWSTR, cchMax: c_int, flags: UINT) -> c_int --- + GetMenuState :: proc(hMenu: HMENU, uId: UINT, uFlags: UINT) -> UINT --- + DrawMenuBar :: proc(hWnd: HWND) -> BOOL --- + GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- + CheckMenuItem :: proc(hMenu: HMENU, uIDCHeckItem: UINT, uCheck: UINT) -> DWORD --- + EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- + GetSubMenu :: proc(hMenu: HMENU, nPos: c_int) -> HMENU --- + GetMenuItemID :: proc(hMenu: HMENU, nPos: c_int) -> UINT --- + GetMenuItemCount :: proc(hMenu: HMENU) -> c_int --- + SetMenuItemBitmaps :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, hBitmapUnchecked: HBITMAP, hBitmapChecked: HBITMAP) -> BOOL --- + GetMenuInfo :: proc(hMenu: HMENU, lpMenuInfo: LPMENUINFO) -> BOOL --- + SetMenuInfo :: proc(hMenu: HMENU, lpMenuInfo: LPMENUINFO) -> BOOL --- + EndMenu :: proc() -> BOOL --- + + GetMenuCheckMarkDimensions :: proc() -> LONG --- + CalculatePopupWindowPosition :: proc(anchorPoint: ^POINT, windowSize: ^SIZE, flags: UINT, excludeRect: ^RECT, popupWindowPosition: ^RECT) -> BOOL --- CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: INT) -> HACCEL --- DestroyAcceleratorTable :: proc(hAccel: HACCEL) -> BOOL --- @@ -166,6 +189,7 @@ foreign user32 { 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 --- + MenuItemFromPoint :: proc(hWnd: HWND, hMenu: HMENU, ptScreen: POINT) -> c_int --- GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL --- ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL --- @@ -301,10 +325,6 @@ foreign user32 { GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- - 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 --- @@ -762,32 +782,6 @@ ACCEL :: struct { } 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, @@ -1081,6 +1075,161 @@ COPYDATASTRUCT :: struct { PCOPYDATASTRUCT :: ^COPYDATASTRUCT +// +// Menus +// + +// return codes for `WM_MENUCHAR` + +MNC_IGNORE :: 0 +MNC_CLOSE :: 1 +MNC_EXECUTE :: 2 +MNC_SELECT :: 3 + +TPMPARAMS :: struct { + cbSize: UINT, // Size of structure + rcExclude: RECT, // Screen coordinates of rectangle to exclude when positioning +} + +LPTPMPARAMS :: #type ^TPMPARAMS + +// Menu-specific access flags + +MENU_GET_ITEM_INFO :: 0x0001 // GetMenuInfo, GetMenuItemInfo +MENU_GET_ITEM_DATA :: 0x0002 // Get dwMenuData +MENU_GET_SUBMENU :: 0x0004 // Get Sub Menu +MENU_INSERT_MENU :: 0x0008 // InsertMenu +MENU_INSERT_ITEM :: 0x0010 // InsertMenuItem +MENU_DELETE_MENU :: 0x0020 // DeleteMenu, RemoveMenu +MENU_SET_ITEM_INFO :: 0x0040 // SetMenuItemInfo, ModifyMenu +MENU_ENABLE_ITEM :: 0x0080 // EnableMenuItem +MENU_CHECK_ITEM :: 0x0100 // CheckMenuItem +MENU_SET_DEFAULT_ITEM :: 0x0200 // SetMenuDefaultItem +MENU_SET_ITEM_DATA :: 0x0400 // Set dwMenuData +MENU_SET_SUBMENU :: 0x0800 // Set Sub Menu + +MENU_READ_ACCESS :: STANDARD_RIGHTS_READ | MENU_GET_ITEM_INFO | MENU_GET_ITEM_DATA | MENU_GET_SUBMENU +MENU_WRITE_ACCESS :: STANDARD_RIGHTS_WRITE | MENU_INSERT_MENU | MENU_INSERT_ITEM | MENU_DELETE_MENU | MENU_SET_ITEM_INFO | MENU_ENABLE_ITEM | MENU_CHECK_ITEM | MENU_SET_DEFAULT_ITEM | MENU_SET_ITEM_DATA | MENU_SET_SUBMENU +MENU_EXECUTE_ACCESS :: STANDARD_RIGHTS_EXECUTE +MENU_ALL_ACCESS :: STANDARD_RIGHTS_ALL | MENU_READ_ACCESS | MENU_WRITE_ACCESS | MENU_EXECUTE_ACCESS + +MNS_NOCHECK :: 0x80000000 +MNS_MODELESS :: 0x40000000 +MNS_DRAGDROP :: 0x20000000 +MNS_AUTODISMISS :: 0x10000000 +MNS_NOTIFYBYPOS :: 0x08000000 +MNS_CHECKORBMP :: 0x04000000 + +MIM_MAXHEIGHT :: 0x00000001 +MIM_BACKGROUND :: 0x00000002 +MIM_HELPID :: 0x00000004 +MIM_MENUDATA :: 0x00000008 +MIM_STYLE :: 0x00000010 +MIM_APPLYTOSUBMENUS :: 0x80000000 + +MENUINFO :: struct { + cbSize: DWORD, + fMask: DWORD, + dwStyle: DWORD, + cyMax: UINT, + hbrBack: HBRUSH, + dwContextHelpID: DWORD, + dwMenuData: ULONG_PTR, +} + +LPMENUINFO :: #type ^MENUINFO +LPCMENUINFO :: #type ^MENUINFO + +// `WM_MENUDRAG` return values. + +MND_CONTINUE :: 0 +MND_ENDMENU :: 1 + +MENUGETOBJECTINFO :: struct { + dwFlags: DWORD, + uPos: UINT, + hmenu: HMENU, + riid: PVOID, + pvObj: PVOID, +} + +// `MENUGETOBJECTINFO` dwFlags values + +MNGOF_TOPGAP :: 0x00000001 +MNGOF_BOTTOMGAP :: 0x00000002 + +// `WM_MENUGETOBJECT` return values + +MNGO_NOINTERFACE :: 0x00000000 +MNGO_NOERROR :: 0x00000001 + +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 + +HBMMENU_CALLBACK :: cast(HBITMAP)~cast(uintptr)0 +HBMMENU_SYSTEM :: cast(HBITMAP)cast(uintptr) 1 +HBMMENU_MBAR_RESTORE :: cast(HBITMAP)cast(uintptr) 2 +HBMMENU_MBAR_MINIMIZE :: cast(HBITMAP)cast(uintptr) 3 +HBMMENU_MBAR_CLOSE :: cast(HBITMAP)cast(uintptr) 5 +HBMMENU_MBAR_CLOSE_D :: cast(HBITMAP)cast(uintptr) 6 +HBMMENU_MBAR_MINIMIZE_D :: cast(HBITMAP)cast(uintptr) 7 +HBMMENU_POPUP_CLOSE :: cast(HBITMAP)cast(uintptr) 8 +HBMMENU_POPUP_RESTORE :: cast(HBITMAP)cast(uintptr) 9 +HBMMENU_POPUP_MAXIMIZE :: cast(HBITMAP)cast(uintptr)10 +HBMMENU_POPUP_MINIMIZE :: cast(HBITMAP)cast(uintptr)11 + +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 :: #type ^MENUITEMINFOW +LPCMENUITEMINFOW :: #type ^MENUITEMINFOW + +// Flags for `TrackPopupMenu` + +TPM_LEFTALIGN :: 0x0000 // Positions the shortcut menu so that its left side is aligned with the coordinate specified by the x parameter. +TPM_CENTERALIGN :: 0x0004 // Centers the shortcut menu horizontally relative to the coordinate specified by the x parameter. +TPM_RIGHTALIGN :: 0x0008 // Positions the shortcut menu so that its right side is aligned with the coordinate specified by the x parameter. +TPM_TOPALIGN :: 0x0000 // Positions the shortcut menu so that its top side is aligned with the coordinate specified by the y parameter. +TPM_VCENTERALIGN :: 0x0010 // Centers the shortcut menu vertically relative to the coordinate specified by the y parameter. +TPM_BOTTOMALIGN :: 0x0020 // Positions the shortcut menu so that its bottom side is aligned with the coordinate specified by the y parameter. +TPM_LEFTBUTTON :: 0x0000 // The user can select menu items with only the left mouse button. +TPM_RIGHTBUTTON :: 0x0002 // The user can select menu items with both the left and right mouse buttons. +TPM_RECURSE :: 0x0001 // Use the TPM_RECURSE flag to display a menu when another menu is already displayed. This is intended to support context menus within a menu. +TPM_HORIZONTAL :: 0x0000 +TPM_VERTICAL :: 0x0040 +TPM_NONOTIFY :: 0x0080 // The function does not send notification messages when the user clicks a menu item. +TPM_RETURNCMD :: 0x0100 // The function returns the menu item identifier of the user's selection in the return value. +TPM_HORPOSANIMATION :: 0x0400 // Animates the menu from left to right. +TPM_HORNEGANIMATION :: 0x0800 // Animates the menu from right to left. +TPM_VERPOSANIMATION :: 0x1000 // Animates the menu from top to bottom. +TPM_VERNEGANIMATION :: 0x2000 // Animates the menu from bottom to top. +TPM_NOANIMATION :: 0x4000 // Displays menu without animation. +TPM_LAYOUTRTL :: 0x8000 // For right-to-left text layout, use TPM_LAYOUTRTL. By default, the text layout is left-to-right. +TPM_WORKAREA :: 0x10000 + +// This type is defined for `LoadMenuIndirectW`, but is only ever used as a pointer. +// The contents of a menu item template must be interpted dynamically. +MENUTEMPLATEW :: struct { } + // // Dialog Manager // From 0a45c6c9e702ef729463095a6baf9b8395d450c8 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 26 Sep 2026 11:43:06 +0200 Subject: [PATCH 04/10] Add tooltip related bindings. --- core/sys/windows/comctl32.odin | 10 +++ core/sys/windows/window_messages.odin | 102 +++++++++++++++----------- 2 files changed, 70 insertions(+), 42 deletions(-) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 70eb42f8419..618b5af2926 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -1151,6 +1151,16 @@ NMLVSCROLL :: struct { } LPNMLVSCROLL :: ^NMLVSCROLL +// ToolTip Icons (Set with `TTM_SETTITLE` or `EDITBALLOONTIP.ttiIcon`) + +TTI_NONE :: 0 +TTI_INFO :: 1 +TTI_WARNING :: 2 +TTI_ERROR :: 3 +TTI_INFO_LARGE :: 4 +TTI_WARNING_LARGE :: 5 +TTI_ERROR_LARGE :: 6 + PFNLVCOMPARE :: #type proc "system" (lpItem1,lpItem2: LPARAM, lpUser: LPARAM) -> c_int PFNLVGROUPCOMPARE :: #type proc "system" (item1,item2: c_int, user: rawptr) -> c_int diff --git a/core/sys/windows/window_messages.odin b/core/sys/windows/window_messages.odin index 58c084bc8f1..7c9214b94b0 100644 --- a/core/sys/windows/window_messages.odin +++ b/core/sys/windows/window_messages.odin @@ -384,7 +384,6 @@ RB_INSERTBANDA :: 0x0401 SB_SETTEXTA :: 0x0401 TB_ENABLEBUTTON :: 0x0401 TBM_GETRANGEMIN :: 0x0401 -TTM_ACTIVATE :: 0x0401 WM_CHOOSEFONT_GETLOGFONT :: 0x0401 CBEM_SETIMAGELIST :: 0x0402 DDM_CLOSE :: 0x0402 @@ -402,7 +401,6 @@ RB_GETBARINFO :: 0x0403 SB_GETTEXTLENGTHA :: 0x0403 TBM_GETTIC :: 0x0403 TB_PRESSBUTTON :: 0x0403 -TTM_SETDELAYTIME :: 0x0403 CBEM_GETITEMA :: 0x0404 DDM_END :: 0x0404 PBM_SETSTEP :: 0x0404 @@ -410,31 +408,26 @@ RB_SETBARINFO :: 0x0404 SB_SETPARTS :: 0x0404 TB_HIDEBUTTON :: 0x0404 TBM_SETTIC :: 0x0404 -TTM_ADDTOOLA :: 0x0404 CBEM_SETITEMA :: 0x0405 PBM_STEPIT :: 0x0405 TB_INDETERMINATE :: 0x0405 TBM_SETPOS :: 0x0405 -TTM_DELTOOLA :: 0x0405 CBEM_GETCOMBOCONTROL :: 0x0406 PBM_SETRANGE32 :: 0x0406 RB_SETBANDINFOA :: 0x0406 SB_GETPARTS :: 0x0406 TB_MARKBUTTON :: 0x0406 TBM_SETRANGE :: 0x0406 -TTM_NEWTOOLRECTA :: 0x0406 CBEM_GETEDITCONTROL :: 0x0407 PBM_GETRANGE :: 0x0407 RB_SETPARENT :: 0x0407 SB_GETBORDERS :: 0x0407 TBM_SETRANGEMIN :: 0x0407 -TTM_RELAYEVENT :: 0x0407 CBEM_SETEXSTYLE :: 0x0408 PBM_GETPOS :: 0x0408 RB_HITTEST :: 0x0408 SB_SETMINHEIGHT :: 0x0408 TBM_SETRANGEMAX :: 0x0408 -TTM_GETTOOLINFOA :: 0x0408 CBEM_GETEXSTYLE :: 0x0409 CBEM_GETEXTENDEDSTYLE :: 0x0409 PBM_SETBARCOLOR :: 0x0409 @@ -442,120 +435,95 @@ RB_GETRECT :: 0x0409 SB_SIMPLE :: 0x0409 TB_ISBUTTONENABLED :: 0x0409 TBM_CLEARTICS :: 0x0409 -TTM_SETTOOLINFOA :: 0x0409 CBEM_HASEDITCHANGED :: 0x040a PBM_SETMARQUEE :: 0x040a RB_INSERTBANDW :: 0x040a SB_GETRECT :: 0x040a TB_ISBUTTONCHECKED :: 0x040a TBM_SETSEL :: 0x040a -TTM_HITTESTA :: 0x040a WIZ_QUERYNUMPAGES :: 0x040a CBEM_INSERTITEMW :: 0x040b RB_SETBANDINFOW :: 0x040b SB_SETTEXTW :: 0x040b TB_ISBUTTONPRESSED :: 0x040b TBM_SETSELSTART :: 0x040b -TTM_GETTEXTA :: 0x040b WIZ_NEXT :: 0x040b CBEM_SETITEMW :: 0x040c RB_GETBANDCOUNT :: 0x040c SB_GETTEXTLENGTHW :: 0x040c TB_ISBUTTONHIDDEN :: 0x040c TBM_SETSELEND :: 0x040c -TTM_UPDATETIPTEXTA :: 0x040c WIZ_PREV :: 0x040c CBEM_GETITEMW :: 0x040d RB_GETROWCOUNT :: 0x040d SB_GETTEXTW :: 0x040d TB_ISBUTTONINDETERMINATE :: 0x040d -TTM_GETTOOLCOUNT :: 0x040d CBEM_SETEXTENDEDSTYLE :: 0x040e RB_GETROWHEIGHT :: 0x040e SB_ISSIMPLE :: 0x040e TB_ISBUTTONHIGHLIGHTED :: 0x040e TBM_GETPTICS :: 0x040e -TTM_ENUMTOOLSA :: 0x040e SB_SETICON :: 0x040f TBM_GETTICPOS :: 0x040f -TTM_GETCURRENTTOOLA :: 0x040f PBM_SETSTATE :: 0x0410 RB_IDTOINDEX :: 0x0410 SB_SETTIPTEXTA :: 0x0410 TBM_GETNUMTICS :: 0x0410 -TTM_WINDOWFROMPOINT :: 0x0410 PBM_GETSTATE :: 0x0411 RB_GETTOOLTIPS :: 0x0411 SB_SETTIPTEXTW :: 0x0411 TBM_GETSELSTART :: 0x0411 TB_SETSTATE :: 0x0411 -TTM_TRACKACTIVATE :: 0x0411 RB_SETTOOLTIPS :: 0x0412 SB_GETTIPTEXTA :: 0x0412 TB_GETSTATE :: 0x0412 TBM_GETSELEND :: 0x0412 -TTM_TRACKPOSITION :: 0x0412 RB_SETBKCOLOR :: 0x0413 SB_GETTIPTEXTW :: 0x0413 TB_ADDBITMAP :: 0x0413 TBM_CLEARSEL :: 0x0413 -TTM_SETTIPBKCOLOR :: 0x0413 RB_GETBKCOLOR :: 0x0414 SB_GETICON :: 0x0414 TB_ADDBUTTONSA :: 0x0414 TBM_SETTICFREQ :: 0x0414 -TTM_SETTIPTEXTCOLOR :: 0x0414 RB_SETTEXTCOLOR :: 0x0415 TB_INSERTBUTTONA :: 0x0415 TBM_SETPAGESIZE :: 0x0415 -TTM_GETDELAYTIME :: 0x0415 RB_GETTEXTCOLOR :: 0x0416 TB_DELETEBUTTON :: 0x0416 TBM_GETPAGESIZE :: 0x0416 -TTM_GETTIPBKCOLOR :: 0x0416 RB_SIZETORECT :: 0x0417 TB_GETBUTTON :: 0x0417 TBM_SETLINESIZE :: 0x0417 -TTM_GETTIPTEXTCOLOR :: 0x0417 RB_BEGINDRAG :: 0x0418 TB_BUTTONCOUNT :: 0x0418 TBM_GETLINESIZE :: 0x0418 -TTM_SETMAXTIPWIDTH :: 0x0418 RB_ENDDRAG :: 0x0419 TB_COMMANDTOINDEX :: 0x0419 TBM_GETTHUMBRECT :: 0x0419 -TTM_GETMAXTIPWIDTH :: 0x0419 RB_DRAGMOVE :: 0x041a TBM_GETCHANNELRECT :: 0x041a TB_SAVERESTOREA :: 0x041a -TTM_SETMARGIN :: 0x041a RB_GETBARHEIGHT :: 0x041b TB_CUSTOMIZE :: 0x041b TBM_SETTHUMBLENGTH :: 0x041b -TTM_GETMARGIN :: 0x041b RB_GETBANDINFOW :: 0x041c TB_ADDSTRINGA :: 0x041c TBM_GETTHUMBLENGTH :: 0x041c -TTM_POP :: 0x041c RB_GETBANDINFOA :: 0x041d TB_GETITEMRECT :: 0x041d TBM_SETTOOLTIPS :: 0x041d -TTM_UPDATE :: 0x041d RB_MINIMIZEBAND :: 0x041e TB_BUTTONSTRUCTSIZE :: 0x041e TBM_GETTOOLTIPS :: 0x041e -TTM_GETBUBBLESIZE :: 0x041e RB_MAXIMIZEBAND :: 0x041f TBM_SETTIPSIDE :: 0x041f TB_SETBUTTONSIZE :: 0x041f -TTM_ADJUSTRECT :: 0x041f TBM_SETBUDDY :: 0x0420 TB_SETBITMAPSIZE :: 0x0420 -TTM_SETTITLEA :: 0x0420 MSG_FTS_JUMP_VA :: 0x0421 TB_AUTOSIZE :: 0x0421 TBM_GETBUDDY :: 0x0421 -TTM_SETTITLEW :: 0x0421 RB_GETBANDBORDERS :: 0x0422 MSG_FTS_JUMP_QWORD :: 0x0423 RB_SHOWBAND :: 0x0423 @@ -582,34 +550,24 @@ TB_SETIMAGELIST :: 0x0430 TB_GETIMAGELIST :: 0x0431 TB_LOADIMAGES :: 0x0432 EM_CANPASTE :: 0x0432 -TTM_ADDTOOLW :: 0x0432 EM_DISPLAYBAND :: 0x0433 TB_GETRECT :: 0x0433 -TTM_DELTOOLW :: 0x0433 EM_EXGETSEL :: 0x0434 TB_SETHOTIMAGELIST :: 0x0434 -TTM_NEWTOOLRECTW :: 0x0434 EM_EXLIMITTEXT :: 0x0435 TB_GETHOTIMAGELIST :: 0x0435 -TTM_GETTOOLINFOW :: 0x0435 EM_EXLINEFROMCHAR :: 0x0436 TB_SETDISABLEDIMAGELIST :: 0x0436 -TTM_SETTOOLINFOW :: 0x0436 EM_EXSETSEL :: 0x0437 TB_GETDISABLEDIMAGELIST :: 0x0437 -TTM_HITTESTW :: 0x0437 EM_FINDTEXT :: 0x0438 TB_SETSTYLE :: 0x0438 -TTM_GETTEXTW :: 0x0438 EM_FORMATRANGE :: 0x0439 TB_GETSTYLE :: 0x0439 -TTM_UPDATETIPTEXTW :: 0x0439 EM_GETCHARFORMAT :: 0x043a TB_GETBUTTONSIZE :: 0x043a -TTM_ENUMTOOLSW :: 0x043a EM_GETEVENTMASK :: 0x043b TB_SETBUTTONWIDTH :: 0x043b -TTM_GETCURRENTTOOLW :: 0x043b EM_GETOLEINTERFACE :: 0x043c TB_SETMAXTEXTROWS :: 0x043c EM_GETPARAFORMAT :: 0x043d @@ -1069,6 +1027,66 @@ LVM_GETFOOTERITEM :: 0x10d0 LVM_GETITEMINDEXRECT :: 0x10d1 LVM_SETITEMINDEXSTATE :: 0x10d2 LVM_GETNEXTITEMINDEX :: 0x10d3 + +// Tool Tip Messages + +TTM_ACTIVATE :: WM_USER + 1 +TTM_SETDELAYTIME :: WM_USER + 3 +TTM_ADDTOOLA :: WM_USER + 4 +TTM_ADDTOOLW :: WM_USER + 50 +TTM_DELTOOLA :: WM_USER + 5 +TTM_DELTOOLW :: WM_USER + 51 +TTM_NEWTOOLRECTA :: WM_USER + 6 +TTM_NEWTOOLRECTW :: WM_USER + 52 +TTM_RELAYEVENT :: WM_USER + 7 // Win7: `wParam` = `GetMessageExtraInfo()` when relaying `WM_MOUSEMOVE` +TTM_GETTOOLINFOA :: WM_USER + 8 +TTM_GETTOOLINFOW :: WM_USER + 53 +TTM_SETTOOLINFOA :: WM_USER + 9 +TTM_SETTOOLINFOW :: WM_USER + 54 +TTM_HITTESTA :: WM_USER + 10 +TTM_HITTESTW :: WM_USER + 55 +TTM_GETTEXTA :: WM_USER + 11 +TTM_GETTEXTW :: WM_USER + 56 +TTM_UPDATETIPTEXTA :: WM_USER + 12 +TTM_UPDATETIPTEXTW :: WM_USER + 57 +TTM_GETTOOLCOUNT :: WM_USER + 13 +TTM_ENUMTOOLSA :: WM_USER + 14 +TTM_ENUMTOOLSW :: WM_USER + 58 +TTM_GETCURRENTTOOLA :: WM_USER + 15 +TTM_GETCURRENTTOOLW :: WM_USER + 59 +TTM_WINDOWFROMPOINT :: WM_USER + 16 +TTM_TRACKACTIVATE :: WM_USER + 17 // `wParam` = `TRUE`/`FALSE` start end `lparam` = `LPTOOLINFO` +TTM_TRACKPOSITION :: WM_USER + 18 // `lParam` = `dwPos` +TTM_SETTIPBKCOLOR :: WM_USER + 19 +TTM_SETTIPTEXTCOLOR :: WM_USER + 20 +TTM_GETDELAYTIME :: WM_USER + 21 +TTM_GETTIPBKCOLOR :: WM_USER + 22 +TTM_GETTIPTEXTCOLOR :: WM_USER + 23 +TTM_SETMAXTIPWIDTH :: WM_USER + 24 +TTM_GETMAXTIPWIDTH :: WM_USER + 25 +TTM_SETMARGIN :: WM_USER + 26 // `lParam` = `lprc` +TTM_GETMARGIN :: WM_USER + 27 // `lParam` = `lprc` +TTM_POP :: WM_USER + 28 +TTM_UPDATE :: WM_USER + 29 +TTM_GETBUBBLESIZE :: WM_USER + 30 +TTM_ADJUSTRECT :: WM_USER + 31 +TTM_SETTITLEA :: WM_USER + 32 // `wParam` = `TTI_*`, `lParam` = `char* szTitle` +TTM_SETTITLEW :: WM_USER + 33 // `wParam` = `TTI_*`, `lParam` = `wchar* szTitle` +TTM_POPUP :: WM_USER + 34 +TTM_GETTITLE :: WM_USER + 35 // `wParam` = `0`, `lParam` = `TTGETTITLE*` +TTM_ADDTOOL :: TTM_ADDTOOLW +TTM_DELTOOL :: TTM_DELTOOLW +TTM_NEWTOOLRECT :: TTM_NEWTOOLRECTW +TTM_GETTOOLINFO :: TTM_GETTOOLINFOW +TTM_SETTOOLINFO :: TTM_SETTOOLINFOW +TTM_HITTEST :: TTM_HITTESTW +TTM_GETTEXT :: TTM_GETTEXTW +TTM_UPDATETIPTEXT :: TTM_UPDATETIPTEXTW +TTM_ENUMTOOLS :: TTM_ENUMTOOLSW +TTM_GETCURRENTTOOL :: TTM_GETCURRENTTOOLW +TTM_SETTITLE :: TTM_SETTITLEW +TTM_SETWINDOWTHEME :: CCM_SETWINDOWTHEME + TV_FIRST :: 0x1100 TVM_INSERTITEMA :: (TV_FIRST+0) TVM_DELETEITEM :: (TV_FIRST+1) From a7e5e20c1fb4934e2be301a120c4a224a807df98 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 26 Sep 2026 17:31:10 +0200 Subject: [PATCH 05/10] Add LoadString bindings. --- core/sys/windows/user32.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 948e3b6f6a4..6c303a6a8ef 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -114,6 +114,8 @@ foreign user32 { LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE --- + LoadStringA :: proc(hInstance: HINSTANCE, uID: UINT, lpBuffer: LPSTR, cchBufferMax: c_int) -> c_int --- + LoadStringW :: proc(hInstance: HINSTANCE, uID: UINT, lpBuffer: LPWSTR, cchBufferMax: c_int) -> c_int --- 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 --- From be8f50caf1fce7ef6f5b10ead8000ba271ef329c Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sun, 27 Sep 2026 19:48:20 +0200 Subject: [PATCH 06/10] Fix accelerator table signatures. --- core/sys/windows/user32.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 6c303a6a8ef..837cdee2fb9 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -179,11 +179,11 @@ foreign user32 { GetMenuCheckMarkDimensions :: proc() -> LONG --- CalculatePopupWindowPosition :: proc(anchorPoint: ^POINT, windowSize: ^SIZE, flags: UINT, excludeRect: ^RECT, popupWindowPosition: ^RECT) -> BOOL --- - CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: INT) -> HACCEL --- + CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: c_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 --- + TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> c_int --- + CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> c_int --- InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL --- GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- From 4456f4e29a4c301625d97a7f892654098eb209d9 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 28 Sep 2026 13:19:50 +0200 Subject: [PATCH 07/10] Add icon constants. --- core/sys/windows/user32.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 837cdee2fb9..3ea7a6b3909 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -784,6 +784,10 @@ ACCEL :: struct { } LPACCEL :: ^ACCEL +ICON_SMALL :: 0 +ICON_BIG :: 1 +ICON_SMALL2 :: 2 + DISPLAY_DEVICEW :: struct { cb: DWORD, DeviceName: [32]WCHAR, From 5cc065d6a775cf2f4f8df101c254ad3d08f75efe Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 28 Sep 2026 14:39:50 +0200 Subject: [PATCH 08/10] Add GetDeviceCaps parameter constants. --- core/sys/windows/gdi32.odin | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index c4a2a086685..5230674db2f 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -111,6 +111,58 @@ PALETTEINDEX :: #force_inline proc "contextless" (#any_int i: int) -> COLORREF { return COLORREF(DWORD(0x01000000) | DWORD(WORD(i))) } +// Device Parameters for `GetDeviceCaps()` + +DRIVERVERSION :: 0 // Device driver version +TECHNOLOGY :: 2 // Device classification +HORZSIZE :: 4 // Horizontal size in millimeters +VERTSIZE :: 6 // Vertical size in millimeters +HORZRES :: 8 // Horizontal width in pixels +VERTRES :: 10 // Vertical height in pixels +BITSPIXEL :: 12 // Number of bits per pixel +PLANES :: 14 // Number of planes +NUMBRUSHES :: 16 // Number of brushes the device has +NUMPENS :: 18 // Number of pens the device has +NUMMARKERS :: 20 // Number of markers the device has +NUMFONTS :: 22 // Number of fonts the device has +NUMCOLORS :: 24 // Number of colors the device supports +PDEVICESIZE :: 26 // Size required for device descriptor +CURVECAPS :: 28 // Curve capabilities +LINECAPS :: 30 // Line capabilities +POLYGONALCAPS :: 32 // Polygonal capabilities +TEXTCAPS :: 34 // Text capabilities +CLIPCAPS :: 36 // Clipping capabilities +RASTERCAPS :: 38 // Bitblt capabilities +ASPECTX :: 40 // Length of the X leg +ASPECTY :: 42 // Length of the Y leg +ASPECTXY :: 44 // Length of the hypotenuse + +LOGPIXELSX :: 88 // Logical pixels/inch in X +LOGPIXELSY :: 90 // Logical pixels/inch in Y + +SIZEPALETTE :: 104 // Number of entries in physical palette +NUMRESERVED :: 106 // Number of reserved entries in palette +COLORRES :: 108 // Actual color resolution + +// Printing related DeviceCaps. These replace the appropriate Escapes + +PHYSICALWIDTH :: 110 // Physical Width in device units +PHYSICALHEIGHT :: 111 // Physical Height in device units +PHYSICALOFFSETX :: 112 // Physical Printable Area x margin +PHYSICALOFFSETY :: 113 // Physical Printable Area y margin +SCALINGFACTORX :: 114 // Scaling factor x +SCALINGFACTORY :: 115 // Scaling factor y + +// Display driver specific + +VREFRESH :: 116 // Current vertical refresh rate of the display device (for displays only) in Hz +DESKTOPVERTRES :: 117 // Horizontal width of entire desktop in pixels +DESKTOPHORZRES :: 118 // Vertical height of entire desktop in pixels +BLTALIGNMENT :: 119 // Preferred blt alignment + +SHADEBLENDCAPS :: 120 // Shading and blending caps +COLORMGMTCAPS :: 121 // Color Management caps + FXPT2DOT30 :: distinct i32 // fixed.Fixed(i32, 30) CIEXYZ :: struct { From 025b54141279f90afcebf4f2daae2f3a457be726 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Tue, 29 Sep 2026 11:04:44 +0200 Subject: [PATCH 09/10] Add bitmap and color space related bindings and definitions --- core/sys/windows/gdi32.odin | 141 +++++++++++++++++++++++++++++++++++- core/sys/windows/types.odin | 12 +++ 2 files changed, 152 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 5230674db2f..0225a3854e3 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -94,6 +94,23 @@ foreign gdi32 { MoveToEx :: proc(hdc: HDC, x: i32, y: i32, lppt: ^POINT) -> BOOL --- LineTo :: proc(hdc: HDC, x: i32, y: i32) -> BOOL --- PolylineTo :: proc(hdc: HDC, apt: [^]POINT, cpt: DWORD) -> BOOL --- + + // Color Space Functions + SetICMMode :: proc(hdc: HDC, mode: c_int) -> c_int --- + CheckColorsInGamut :: proc(hdc: HDC, lpRGBTriple: ^RGBTRIPLE, dlpBuffer: LPVOID, nCount: DWORD) -> BOOL --- + GetColorSpace :: proc(hdc: HDC) -> HCOLORSPACE --- + SetColorSpace :: proc(hdc: HDC, hcs: HCOLORSPACE) -> HCOLORSPACE --- + GetLogColorSpaceW :: proc(hColorSpace: HCOLORSPACE, lpBuffer: ^LOGCOLORSPACEW, nSize: WORD) -> BOOL --- + CreateColorSpaceW :: proc(lplcs: ^LOGCOLORSPACEW) -> HCOLORSPACE --- + DeleteColorSpace :: proc(hcs: HCOLORSPACE) -> BOOL --- + GetICMProfileW :: proc(hdc: HDC, pBufSize: LPDWORD, pszFilename: LPWSTR) -> BOOL --- + SetICMProfileW :: proc(hdc: HDC, lpFileName: LPWSTR) -> BOOL --- + GetDeviceGammaRamp :: proc(hdc: HDC, lpRamp: LPVOID) -> BOOL --- // Writes `(3 * 256 * 2)` bytes to `lpRamp`. + SetDeviceGammaRamp :: proc(hdc: HDC, lpRamp: LPVOID) -> BOOL --- // Reads `(3 * 256 * 2)` bytes from `lpRamp`. + ColorMatchToTarget :: proc(hdc: HDC, hdcTarget: HDC, action: DWORD) -> BOOL --- + EnumICMProfilesW :: proc(hdc: HDC, p: ICMENUMPROCW, param: LPARAM) -> c_int --- + UpdateICMRegKeyW :: proc(reserved: DWORD, lpszCMID: LPWSTR, lpszFileName: LPWSTR, command: UINT) -> BOOL --- + ColorCorrectPalette :: proc(hdc: HDC, hPal: HPALETTE, deFirst: DWORD, num: DWORD) -> BOOL --- } @(require_results) @@ -163,7 +180,8 @@ BLTALIGNMENT :: 119 // Preferred blt alignment SHADEBLENDCAPS :: 120 // Shading and blending caps COLORMGMTCAPS :: 121 // Color Management caps -FXPT2DOT30 :: distinct i32 // fixed.Fixed(i32, 30) +FXPT16DOT16 :: distinct i32 // fixed.Fixed(i32, 16) +FXPT2DOT30 :: distinct i32 // fixed.Fixed(i32, 30) CIEXYZ :: struct { ciexyzX, ciexyzY, ciexyzZ: FXPT2DOT30, @@ -173,6 +191,50 @@ CIEXYZTRIPLE :: struct { ciexyzRed, ciexyzGreen, ciexyzBlue: CIEXYZ, } +BITMAPCOREHEADER :: struct { + bcSize: DWORD, // used to get to color table + bcWidth: WORD, + bcHeight: WORD, + bcPlanes: WORD, + bcBitCount: WORD, +} + +BITMAPCOREINFO :: struct($num_color_table_entries: int) { + bmciHeader: BITMAPCOREHEADER, + bmciColors: [num_color_table_entries]RGBTRIPLE, +} + +BITMAPFILEHEADER :: struct { + bfType: WORD, + bfSize: DWORD, + bfReserved1: WORD, + bfReserved2: WORD, + bfOffBits: DWORD, +} + +BITMAPV4HEADER :: struct { + bV4Size: DWORD, + bV4Width: LONG, + bV4Height: LONG, + bV4Planes: WORD, + bV4BitCount: WORD, + bV4V4Compression: DWORD, + bV4SizeImage: DWORD, + bV4XPelsPerMeter: LONG, + bV4YPelsPerMeter: LONG, + bV4ClrUsed: DWORD, + bV4ClrImportant: DWORD, + bV4RedMask: DWORD, + bV4GreenMask: DWORD, + bV4BlueMask: DWORD, + bV4AlphaMask: DWORD, + bV4CSType: DWORD, + bV4Endpoints: CIEXYZTRIPLE, + bV4GammaRed: DWORD, + bV4GammaGreen: DWORD, + bV4GammaBlue: DWORD, +} + // https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapv5header BITMAPV5HEADER :: struct { bV5Size: DWORD, @@ -201,6 +263,83 @@ BITMAPV5HEADER :: struct { bV5Reserved: DWORD, } +// Values for `bV5CSType` + +PROFILE_LINKED :: 0x4C494E4B // 'LINK' +PROFILE_EMBEDDED :: 0x4D424544 // 'MBED' + +ICM_OFF :: 1 +ICM_ON :: 2 +ICM_QUERY :: 3 +ICM_DONE_OUTSIDEDC :: 4 + +ICMENUMPROCW :: #type proc "system" (name: LPWSTR, lparam: LPARAM) -> c_int + +// Image Color Matching color definitions + +CS_ENABLE :: 0x00000001 +CS_DISABLE :: 0x00000002 +CS_DELETE_TRANSFORM :: 0x00000003 + +// Logcolorspace signature + +LCS_SIGNATURE :: 0x50534F43 // 'PSOC' + +// Logcolorspace lcsType values + +LCS_sRGB :: 0x73524742 // 'sRGB' +LCS_WINDOWS_COLOR_SPACE :: 0x57696E20 // 'Win ' - Windows default color space + +LCSCSTYPE :: #type LONG + +LCS_CALIBRATED_RGB :: 0x00000000 + +LCSGAMUTMATCH :: #type LONG + +LCS_GM_BUSINESS :: 0x00000001 +LCS_GM_GRAPHICS :: 0x00000002 +LCS_GM_IMAGES :: 0x00000004 +LCS_GM_ABS_COLORIMETRIC :: 0x00000008 + +// ICM Defines for results from `CheckColorInGamut()` + +CM_OUT_OF_GAMUT :: 255 +CM_IN_GAMUT :: 0 + +// `UpdateICMRegKey` Constants + +ICM_ADDPROFILE :: 1 +ICM_DELETEPROFILE :: 2 +ICM_QUERYPROFILE :: 3 +ICM_SETDEFAULTPROFILE :: 4 +ICM_REGISTERICMATCHER :: 5 +ICM_UNREGISTERICMATCHER :: 6 +ICM_QUERYMATCH :: 7 + +// Macros to retrieve CMYK values from a `COLORREF` + +GetKValue :: #force_inline proc "contextless" (cmyk: COLORREF) -> BYTE { return cast(BYTE)(cmyk ) } +GetYValue :: #force_inline proc "contextless" (cmyk: COLORREF) -> BYTE { return cast(BYTE)(cmyk >> 8) } +GetMValue :: #force_inline proc "contextless" (cmyk: COLORREF) -> BYTE { return cast(BYTE)(cmyk >> 16) } +GetCValue :: #force_inline proc "contextless" (cmyk: COLORREF) -> BYTE { return cast(BYTE)(cmyk >> 24) } + +CMYK :: #force_inline proc "contextless" (c, m, y, k: BYTE) -> COLORREF { + return cast(DWORD)k | cast(DWORD)y << 8 | cast(DWORD)m << 16 | cast(DWORD)c << 24 +} + +LOGCOLORSPACEW :: struct { + lcsSignature: DWORD, + lcsVersion: DWORD, + lcsSize: DWORD, + lcsCSType: LCSCSTYPE, + lcsIntent: LCSGAMUTMATCH, + lcsEndpoints: CIEXYZTRIPLE, + lcsGammaRed: DWORD, + lcsGammaGreen: DWORD, + lcsGammaBlue: DWORD, + lcsFilename: [MAX_PATH]WCHAR, +} + PALETTEENTRY :: struct { peRed, peGreen, peBlue, peFlags: BYTE, } diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 1ab9913f54d..e57811e455b 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -46,6 +46,7 @@ HRGN :: distinct HANDLE HRSRC :: distinct HANDLE HWINSTA :: distinct HANDLE HACCEL :: distinct HANDLE +HCOLORSPACE :: distinct HANDLE BOOL :: distinct b32 BYTE :: distinct u8 BOOLEAN :: distinct b8 @@ -2519,6 +2520,12 @@ STOCK_LAST :: 19 CLR_INVALID :: 0xFFFFFFFF +RGBTRIPLE :: struct #packed { + rgbtBlue: BYTE, + rgbtGreen: BYTE, + rgbtRed: BYTE, +} + RGBQUAD :: struct { rgbBlue: BYTE, rgbGreen: BYTE, @@ -2571,6 +2578,11 @@ BITMAPINFOHEADER :: struct { BITMAPINFO :: struct { bmiHeader: BITMAPINFOHEADER, + + // NOTE: The actual length of this array is dynamic, and depends + // on the number of color table entries if the bitmap uses + // indexed color, OR the number of bitfields if the bitmap + // header specifies a bitfield value in `biCompression`. bmiColors: [1]RGBQUAD, } From 279e9e01f4788a7e2d967bd35e265c757ea3ec41 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Tue, 29 Sep 2026 18:04:27 +0200 Subject: [PATCH 10/10] Add misc win32 bindings. --- core/sys/windows/kernel32.odin | 3 +++ core/sys/windows/types.odin | 2 +- core/sys/windows/user32.odin | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 728bed4854c..e9db54aaea2 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -556,6 +556,9 @@ foreign kernel32 { 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 --- + GetThreadUILanguage :: proc() -> LANGID --- + SetThreadUILanguage :: proc(LangId: LANGID) -> LANGID --- + GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD --- GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD --- GetShortPathNameW :: proc(long, short: LPCWSTR, len: DWORD) -> DWORD --- diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index e57811e455b..03b520de52d 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1272,7 +1272,7 @@ FF_MODERN :: 3 << 4 FF_SCRIPT :: 4 << 4 FF_DECORATIVE :: 5 << 4 -TIMERPROC :: #type proc "system" (HWND, UINT, UINT_PTR, DWORD) +TIMERPROC :: #type proc "system" (hWnd: HWND, uMsg: UINT, idEvent: UINT_PTR, dwTime: DWORD) WNDPROC :: #type proc "system" (HWND, UINT, WPARAM, LPARAM) -> LRESULT diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 3ea7a6b3909..90e6bc2f17e 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -167,6 +167,7 @@ foreign user32 { DrawMenuBar :: proc(hWnd: HWND) -> BOOL --- GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- CheckMenuItem :: proc(hMenu: HMENU, uIDCHeckItem: UINT, uCheck: UINT) -> DWORD --- + CheckMenuRadioItem :: proc(hMenu: HMENU, first: UINT, last: UINT, check: UINT, flags: UINT) -> BOOL --- EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- GetSubMenu :: proc(hMenu: HMENU, nPos: c_int) -> HMENU --- GetMenuItemID :: proc(hMenu: HMENU, nPos: c_int) -> UINT ---