sokol-luajit/ffi/windows.lua

470 lines
15 KiB
Lua

local ffi = require( "ffi" )
ffi.cdef[[
typedef char* PCIDLIST_ABSOLUTE;
typedef char* LPCTSTR;
typedef char* LPCSTR;
typedef char* LPTSTR;
typedef char* LPSTR;
typedef void* LPVOID;
typedef uint64_t HANDLE;
typedef uint64_t HHOOK;
typedef uint32_t HRESULT;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef __int64 LONG_PTR, *PLONG_PTR;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
typedef uint64_t LRESULT;
typedef uint32_t UINT;
typedef uint64_t HWND;
typedef uint32_t DWORD;
typedef DWORD * LPDWORD;
typedef uint32_t LONG;
typedef uint32_t HINSTANCE;
typedef uint16_t WORD;
typedef uint32_t COLORREF;
typedef unsigned char BYTE;
enum {
// Use crKey as the transparency color.
LWA_COLORKEY = 0x00000001,
//Use bAlpha to determine the opacity of the layered window.
LWA_ALPHA = 0x00000002,
};
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
typedef RECT *PRECT;
typedef RECT *NPRECT;
typedef RECT *LPRECT;
typedef struct tagBITMAP {
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
void * bmBits;
} BITMAP;
typedef BITMAP *PBITMAP;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef BITMAPFILEHEADER *PBITMAPFILEHEADER;
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
HANDLE lpfnHook;
LPCTSTR lpTemplateName;
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
} OPENFILENAME;
typedef OPENFILENAME *LPOPENFILENAME;
typedef int32_t bool32;
typedef intptr_t (__stdcall *WNDPROC)(HWND hwnd, unsigned int message, uintptr_t wparam, intptr_t lparam);
enum {
PROCESS_P_WAIT = 0,
PROCESS_P_NOWAIT = 1,
PROCESS_P_OVERLAY = 2,
PROCESS_OLD_P_OVERLAY = 2,
PROCESS_P_NOWAITO = 3,
PROCESS_P_DETACH = 4,
STATUS_PENDING = 0x00000103,
STARTF_USESTDHANDLES = 0x00000100,
CS_VREDRAW = 0x0001,
CS_HREDRAW = 0x0002,
WM_DESTROY = 0x0002,
WM_SIZE = 0x0005,
WM_CLOSE = 0x0010,
WM_GETMINMAXINFO = 0x0024,
WM_NCHITTEST = 0x0084,
WM_QUIT = 0x0012,
WM_ERASEBKGND = 0x0014,
WM_SYSCOLORCHANGE = 0x0015,
WM_SHOWWINDOW = 0x0018,
WM_WININICHANGE = 0x001A,
WM_MOUSEFIRST = 0x0200,
WM_MOUSEMOVE = 0x0200,
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_LBUTTONDBLCLK = 0x0203,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205,
WM_RBUTTONDBLCLK = 0x0206,
WM_MBUTTONDOWN = 0x0207,
WM_MBUTTONUP = 0x0208,
WM_MBUTTONDBLCLK = 0x0209,
WM_MOUSEWHEEL = 0x020A,
WM_NCMOUSEMOVE = 0x00A0,
WM_NCLBUTTONDOWN = 0x00A1,
WM_NCLBUTTONUP = 0x00A2,
WM_NCLBUTTONDBLCLK = 0x00A3,
WM_NCRBUTTONDOWN = 0x00A4,
WM_NCRBUTTONUP = 0x00A5,
WM_NCRBUTTONDBLCLK = 0x00A6,
WM_NCMBUTTONDOWN = 0x00A7,
WM_NCMBUTTONUP = 0x00A8,
WM_NCMBUTTONDBLCLK = 0x00A9,
WS_BORDER = 0x00800000,
WS_CAPTION = 0x00C00000,
WS_CHILD = 0x40000000,
WS_CHILDWINDOW = 0x40000000,
WS_CLIPCHILDREN = 0x02000000,
WS_CLIPSIBLINGS = 0x04000000,
WS_DISABLED = 0x08000000,
WS_DLGFRAME = 0x00400000,
WS_GROUP = 0x00020000,
WS_HSCROLL = 0x00100000,
WS_ICONIC = 0x20000000,
WS_MAXIMIZE = 0x01000000,
WS_MAXIMIZEBOX = 0x00010000,
WS_MINIMIZE = 0x20000000,
WS_MINIMIZEBOX = 0x00020000,
WS_OVERLAPPED = 0x00000000,
WS_SIZEBOX = 0x00040000,
WS_SYSMENU = 0x00080000,
WS_TABSTOP = 0x00010000,
WS_THICKFRAME = 0x00040000,
WS_TILED = 0x00000000,
WS_VISIBLE = 0x10000000,
WS_VSCROLL = 0x00200000,
WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_TOPMOST = 0x00000008,
WS_EX_TRANSPARENT = 0x00000020,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE= 0x00000100,
WS_EX_CLIENTEDGE= 0x00000200,
WS_EX_APPWINDOW = 0x00040000,
WS_EX_LAYERED = 0x00080000,
WS_EX_STATICEDGE= 0x00200000,
WS_POPUP = ((int)0x80000000),
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_POPUPWINDOW = WS_POPUP | WS_BORDER,
WS_TILEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_SIMPLEWINDOW = WS_POPUP | WS_BORDER| WS_THICKFRAME,
WS_NOBORDERS = WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU,
WAIT_OBJECT_0 = 0x00000000,
PM_NOREMOVE = 0x0000,
PM_REMOVE = 0x0001,
SW_SHOW = 5,
SW_MAXIMIZE = 3,
INFINITE = 0xFFFFFFFF,
QS_ALLEVENTS = 0x04BF,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_CALLWNDPROCRET = 12,
/*
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
*/
HTERROR = (-2),
HTTRANSPARENT = (-1),
HTNOWHERE = 0,
HTCLIENT = 1,
HTCAPTION = 2,
/*
* Window field offsets for GetWindowLong()
*/
GWL_WNDPROC = (-4),
GWL_HINSTANCE = (-6),
GWL_HWNDPARENT = (-8),
GWL_STYLE = (-16),
GWL_EXSTYLE = (-20),
GWL_USERDATA = (-21),
GWL_ID = (-12),
GWLP_WNDPROC = (-4),
SWP_NOSIZE = 0x0001,
SWP_NOZORDER = 0x0004,
SWP_FRAMECHANGED = 0x0020,
SEE_MASK_NOCLOSEPROCESS = 0x00000040,
SEE_MASK_FLAG_NO_UI = 0x00000400
};
typedef struct _SHELLEXECUTEINFOA {
DWORD cbSize;
uint64_t fMask;
HWND hwnd;
LPCSTR lpVerb;
LPCSTR lpFile;
LPCSTR lpParameters;
LPCSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
void *lpIDList;
LPCSTR lpClass;
HANDLE hkeyClass;
DWORD dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
typedef struct _STARTUPINFOA {
uint32_t cb;
void * lpReserved;
void * lpDesktop;
void * lpTitle;
uint32_t dwX;
uint32_t dwY;
uint32_t dwXSize;
uint32_t dwYSize;
uint32_t dwXCountChars;
uint32_t dwYCountChars;
uint32_t dwFillAttribute;
uint32_t dwFlags;
uint16_t wShowWindow;
uint16_t cbReserved2;
void * lpReserved2;
void * hStdInput;
void * hStdOutput;
void * hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
typedef struct _PROCESS_INFORMATION {
uint64_t hProcess;
uint64_t hThread;
uint32_t dwProcessId;
uint32_t dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
typedef struct POINT { int32_t x, y; } POINT;
typedef struct WNDCLASSEXA {
uint32_t cbSize, style;
WNDPROC lpfnWndProc;
int32_t cbClsExtra, cbWndExtra;
HANDLE hInstance;
HANDLE hIcon;
HANDLE hCursor;
HANDLE hbrBackground;
const char* lpszMenuName;
const char* lpszClassName;
HANDLE hIconSm;
} WNDCLASSEXA;
typedef struct MSG {
HWND hwnd;
uint32_t message;
uintptr_t wParam, lParam;
uint32_t time;
POINT pt;
} MSG;
typedef struct SECURITY_ATTRIBUTES {
uint32_t nLength;
void* lpSecurityDescriptor;
bool32 bInheritHandle;
} SECURITY_ATTRIBUTES;
enum {
CF_TEXT = 1,
CF_BITMAP = 2,
CF_DIB = 8
};
typedef enum tagCOINIT {
COINIT_APARTMENTTHREADED = 0x2,
COINIT_MULTITHREADED = 0x0,
COINIT_DISABLE_OLE1DDE = 0x4,
COINIT_SPEED_OVER_MEMORY = 0x8
} COINIT;
typedef enum {
ASSOCF_NONE = 0x00000000,
ASSOCF_INIT_NOREMAPCLSID = 0x00000001,
ASSOCF_INIT_BYEXENAME = 0x00000002,
ASSOCF_OPEN_BYEXENAME = 0x00000002,
ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004,
ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008,
ASSOCF_NOUSERSETTINGS = 0x00000010,
ASSOCF_NOTRUNCATE = 0x00000020,
ASSOCF_VERIFY = 0x00000040,
ASSOCF_REMAPRUNDLL = 0x00000080,
ASSOCF_NOFIXUPS = 0x00000100,
ASSOCF_IGNOREBASECLASS = 0x00000200,
ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400,
ASSOCF_INIT_FIXED_PROGID = 0x00000800,
ASSOCF_IS_PROTOCOL = 0x00001000,
ASSOCF_INIT_FOR_FILE = 0x00002000,
ASSOCF_IS_FULL_URI = 0x00004000,
ASSOCF_PER_MACHINE_ONLY = 0x00008000,
ASSOCF_APP_TO_APP = 0x00010000,
} ASSOCF;
typedef enum {
ASSOCSTR_COMMAND = 1,
ASSOCSTR_EXECUTABLE,
ASSOCSTR_FRIENDLYDOCNAME,
ASSOCSTR_FRIENDLYAPPNAME,
ASSOCSTR_NOOPEN,
ASSOCSTR_SHELLNEWVALUE,
ASSOCSTR_DDECOMMAND,
ASSOCSTR_DDEIFEXEC,
ASSOCSTR_DDEAPPLICATION,
ASSOCSTR_DDETOPIC,
ASSOCSTR_INFOTIP,
ASSOCSTR_QUICKTIP,
ASSOCSTR_TILEINFO,
ASSOCSTR_CONTENTTYPE,
ASSOCSTR_DEFAULTICON,
ASSOCSTR_SHELLEXTENSION,
ASSOCSTR_DROPTARGET,
ASSOCSTR_DELEGATEEXECUTE,
ASSOCSTR_SUPPORTED_URI_PROTOCOLS,
ASSOCSTR_PROGID,
ASSOCSTR_APPID,
ASSOCSTR_APPPUBLISHER,
ASSOCSTR_APPICONREFERENCE,
ASSOCSTR_MAX
} ASSOCSTR;
typedef bool32 (*WinEnumWindowsProc)( HWND hwnd, LPARAM lParam );
typedef LRESULT (* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef LRESULT (* WNDPROC)(HWND hwnd, int code, WPARAM wParam, LPARAM lParam);
typedef int64_t (* FARPROC)();
uint32_t _spawnvp(int mode, const char *cmdname, const char *const *argv);
bool GetExitCodeProcess( uint64_t hProcess, uint32_t * lpExitCode);
uint32_t WaitForInputIdle(uint64_t hProcess, uint32_t dwMilliseconds);
uint32_t CreateProcessA(
void *,
const char * commandLine,
void *,
void *,
bool,
uint32_t,
void *,
const char * currentDirectory,
LPSTARTUPINFOA,
LPPROCESS_INFORMATION
);
bool32 ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo);
bool32 TerminateProcess(HANDLE hProcess, uint32_t uExitCode);
bool32 CloseHandle(HANDLE hObject);
HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
HRESULT AssocQueryStringA(ASSOCF flags, ASSOCSTR str, LPCSTR pszAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
int OpenClipboard(HANDLE);
HANDLE GetClipboardData(unsigned);
int CloseClipboard();
HANDLE GlobalLock(HANDLE);
int GlobalUnlock(HANDLE);
size_t GlobalSize(HANDLE);
bool32 EmptyClipboard(void);
bool32 IsClipboardFormatAvailable(uint32_t format);
HANDLE GetModuleHandleA(const char* name);
uint16_t RegisterClassExA(const WNDCLASSEXA*);
intptr_t DefWindowProcA(HWND hwnd, uint32_t msg, uintptr_t wparam, uintptr_t lparam);
void PostQuitMessage(int exitCode);
HANDLE LoadIconA(HANDLE hInstance, const char* iconName);
HANDLE LoadCursorA(HANDLE hInstance, const char* cursorName);
uint32_t GetLastError();
DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );
bool32 SetDllDirectoryA( LPCSTR lpPathName );
DWORD GetDllDirectoryA( DWORD nBufferLength, LPSTR lpBuffer);
HANDLE CreateWindowExA(uint32_t exstyle, const char* classname, const char* windowname, int32_t style, int32_t x, int32_t y, int32_t width, int32_t height, HWND parent_hwnd, HWND hmenu, HANDLE hinstance, void* param);
bool32 SetWindowPos(HWND hWnd,int hWndInsertAfter, int X, int Y, int cx, int cy, uint32_t uFlags);
bool32 ShowWindow(HWND hwnd, int32_t command);
bool32 CloseWindow(HWND hWnd);
bool32 UpdateWindow(HWND hwnd);
HWND FindWindowA(const char * lpClassName, const char * lpWindowName );
bool32 SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha,uint32_t dwFlags);
bool32 UpdateLayeredWindow(HWND hWnd, HANDLE hdcDst, void *pptDst,void *psize, HANDLE hdcSrc, POINT *pptSrc, COLORREF crKey, void *pblend, uint32_t dwFlags);
HWND SetParent( HWND hWndChild, HWND hWndNewParent);
bool32 MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, bool32 bRepaint);
LONG GetWindowLongA( HWND hWnd,int nIndex);
LONG SetWindowLongA( HWND hWnd, int nIndex, LONG dwNewLong);
bool32 GetClientRect(HWND hWnd, LPRECT lpRect);
bool32 EnumWindows( WinEnumWindowsProc lpEnumFunc,LPARAM lParam );
int GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount);
HWND SetFocus(HWND hWnd);
HHOOK SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
bool32 SetProcessDPIAware();
bool32 PeekMessageA(MSG* out_msg, HWND hwnd, uint32_t filter_min, uint32_t filter_max, uint32_t removalMode);
bool32 TranslateMessage(const MSG* msg);
intptr_t DispatchMessageA(const MSG* msg);
uint32_t SendMessageA(HWND hWnd, uint32_t Msg, uintptr_t wParam, uintptr_t lParam );
uint32_t PostMessageA(HWND hWnd, uint32_t Msg, uintptr_t wParam, uintptr_t lParam );
bool32 InvalidateRect(HWND hwnd, const RECT*, bool32 erase);
HANDLE CreateEventA(SECURITY_ATTRIBUTES*, bool32 manualReset, bool32 initialState, const char* name);
uint32_t MsgWaitForMultipleObjects(uint32_t count, HANDLE* handles, bool32 waitAll, uint32_t ms, uint32_t wakeMask);
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
bool32 SetEnvironmentVariableA(const char * lpName, const char * lpValue);
uint32_t SetWindowLongA(HWND hWnd, int nIndex, uint32_t dwNewLong );
LONG_PTR SetWindowLongPtrA( HWND hWnd, int nIndex, LONG_PTR dwNewLong );
LRESULT CallWindowProcA( WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg,WPARAM wParam,LPARAM lParam);
bool32 IsWindow(HWND hWnd);
HWND GetDesktopWindow();
bool32 GetWindowRect(HWND hWnd, LPRECT lpRect);
bool32 GetOpenFileNameA( LPOPENFILENAME lpofn);
void keybd_event(uint8_t bVk, uint8_t bScan, uint32_t dwFlags, void * dwExtraInfo);
void Sleep(DWORD dwMilliseconds);
int GetObjectA(void * hgdiobj, uint32_t cbBuffer, void * lpvObject);
uint32_t GetBitmapBits( void * hbmp, uint32_t cbBuffer,void * lpvBits);
]]