From 03c6862d51a1b1eb7215cad2036e090541a10f58 Mon Sep 17 00:00:00 2001 From: hikari Date: Sat, 18 Mar 2023 06:44:16 +0200 Subject: [PATCH] sys/windows: added some functions and types for input hooks and tray icons --- core/sys/windows/shell32.odin | 2 + core/sys/windows/types.odin | 161 +++++++++++++++++++++++++++++++++- core/sys/windows/user32.odin | 10 ++- 3 files changed, 171 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index 2ac84fbba..0a6f90a44 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -23,6 +23,8 @@ foreign shell32 { SHFileOperationW :: proc(lpFileOp: LPSHFILEOPSTRUCTW) -> c_int --- SHGetFolderPathW :: proc(hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPWSTR) -> HRESULT --- SHAppBarMessage :: proc(dwMessage: DWORD, pData: PAPPBARDATA) -> UINT_PTR --- + + Shell_NotifyIconW :: proc(dwMessage: DWORD, lpData: ^NOTIFYICONDATAW) -> BOOL --- } APPBARDATA :: struct { diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 514998a43..3fd14e0d7 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -724,6 +724,14 @@ CWPRETSTRUCT :: struct { hwnd: HWND, } +MSLLHOOKSTRUCT :: struct { + pt: POINT, + mouseData: DWORD, + flags: DWORD, + time: DWORD, + dwExtraInfo: ULONG_PTR, +} + KBDLLHOOKSTRUCT :: struct { vkCode: DWORD, scanCode: DWORD, @@ -732,6 +740,59 @@ KBDLLHOOKSTRUCT :: struct { dwExtraInfo: ULONG_PTR, } +MOUSEINPUT :: struct { + dx: LONG, + dy: LONG, + mouseData: DWORD, + dwFlags: DWORD, + time: DWORD, + dwExtraInfo: ULONG_PTR, +} + +KEYBDINPUT :: struct { + wVk: WORD, + wScan: WORD, + dwFlags: DWORD, + time: DWORD, + dwExtraInfo: ULONG_PTR, +} + +HARDWAREINPUT :: struct { + uMsg: DWORD, + wParamL: WORD, + wParamH: WORD, +} + +INPUT_TYPE :: enum DWORD { + MOUSE = 0, + KEYBOARD = 1, + HARDWARE = 2, +} + +INPUT :: struct { + type: INPUT_TYPE, + using _: struct #raw_union { + mi: MOUSEINPUT, + ki: KEYBDINPUT, + hi: HARDWAREINPUT, + }, +} + +MOUSEEVENTF_MOVE :: 0x0001 +MOUSEEVENTF_LEFTDOWN :: 0x0002 +MOUSEEVENTF_LEFTUP :: 0x0004 +MOUSEEVENTF_RIGHTDOWN :: 0x0008 +MOUSEEVENTF_RIGHTUP :: 0x0010 +MOUSEEVENTF_MIDDLEDOWN :: 0x0020 +MOUSEEVENTF_MIDDLEUP :: 0x0040 +MOUSEEVENTF_XDOWN :: 0x0080 +MOUSEEVENTF_XUP :: 0x0100 +MOUSEEVENTF_WHEEL :: 0x0800 +MOUSEEVENTF_HWHEEL :: 0x1000 +MOUSEEVENTF_MOVE_NOCOALESCE :: 0x2000 +MOUSEEVENTF_VIRTUALDESK :: 0x4000 +MOUSEEVENTF_ABSOLUTE :: 0x8000 + WNDCLASSA :: struct { style: UINT, lpfnWndProc: WNDPROC, @@ -799,6 +860,104 @@ MSG :: struct { LPMSG :: ^MSG +NOTIFYICONDATAW :: struct { + cbSize: DWORD, + hWnd: HWND, + uID: UINT, + uFlags: UINT, + uCallbackMessage: UINT, + hIcon: HICON, + szTip: [128]WCHAR, + dwState: DWORD, + dwStateMask: DWORD, + szInfo: [256]WCHAR, + using _: struct #raw_union { + uTimeout: UINT, + uVersion: UINT, + }, + szInfoTitle: [64]WCHAR, + dwInfoFlags: DWORD, + guidItem: GUID, + hBalloonIcon: HICON, +} + +NIF_MESSAGE :: 0x00000001 +NIF_ICON :: 0x00000002 +NIF_TIP :: 0x00000004 +NIF_STATE :: 0x00000008 +NIF_INFO :: 0x00000010 +NIF_GUID :: 0x00000020 +NIF_REALTIME :: 0x00000040 +NIF_SHOWTIP :: 0x00000080 + +NIM_ADD :: 0x00000000 +NIM_MODIFY :: 0x00000001 +NIM_DELETE :: 0x00000002 +NIM_SETFOCUS :: 0x00000003 +NIM_SETVERSION :: 0x00000004 + +// Menu flags for Add/Check/EnableMenuItem() +MF_INSERT :: 0x00000000 +MF_CHANGE :: 0x00000080 +MF_APPEND :: 0x00000100 +MF_DELETE :: 0x00000200 +MF_REMOVE :: 0x00001000 + +MF_BYCOMMAND :: 0x00000000 +MF_BYPOSITION :: 0x00000400 + +MF_SEPARATOR :: 0x00000800 + +MF_ENABLED :: 0x00000000 +MF_GRAYED :: 0x00000001 +MF_DISABLED :: 0x00000002 + +MF_UNCHECKED :: 0x00000000 +MF_CHECKED :: 0x00000008 +MF_USECHECKBITMAPS :: 0x00000200 + +MF_STRING :: 0x00000000 +MF_BITMAP :: 0x00000004 +MF_OWNERDRAW :: 0x00000100 + +MF_POPUP :: 0x00000010 +MF_MENUBARBREAK :: 0x00000020 +MF_MENUBREAK :: 0x00000040 + +MF_UNHILITE :: 0x00000000 +MF_HILITE :: 0x00000080 + +MF_DEFAULT :: 0x00001000 +MF_SYSMENU :: 0x00002000 +MF_HELP :: 0x00004000 +MF_RIGHTJUSTIFY :: 0x00004000 + +MF_MOUSESELECT :: 0x00008000 +MF_END :: 0x00000080 // Obsolete -- only used by old RES files + +// 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 @@ -4018,4 +4177,4 @@ DNS_SRV_DATAA :: struct { SOCKADDR :: struct { sa_family: ADDRESS_FAMILY, sa_data: [14]CHAR, -} \ No newline at end of file +} diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index f59bdf9e3..c1a6791cc 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -109,6 +109,12 @@ foreign user32 { GetDlgCtrlID :: proc(hWnd: HWND) -> c_int --- GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: c_int) -> HWND --- + CreatePopupMenu :: proc() -> HMENU --- + DestroyMenu :: proc(hMenu: HMENU) -> BOOL --- + AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- + TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x: int, y: int, nReserved: int, hWnd: HWND, prcRect: ^RECT) -> i32 --- + RegisterWindowMessageW :: proc(lpString: LPCWSTR) -> UINT --- + 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 --- @@ -206,6 +212,8 @@ 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 --- + SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- @@ -469,4 +477,4 @@ WINDOWINFO :: struct { atomWindowType: ATOM, wCreatorVersion: WORD, } -PWINDOWINFO :: ^WINDOWINFO \ No newline at end of file +PWINDOWINFO :: ^WINDOWINFO