power_play/src/platform/platform_win32.h
2025-08-05 15:06:06 -05:00

169 lines
3.8 KiB
C

////////////////////////////////
//~ Win32 headers
#pragma warning(push, 0)
# define UNICODE
# define WIN32_LEAN_AND_MEAN
# include <Windows.h>
# include <WinSock2.h>
# include <TlHelp32.h>
# include <WS2tcpip.h>
# include <windowsx.h>
# include <ShlObj_core.h>
# include <fileapi.h>
# include <dwmapi.h>
# include <bcrypt.h>
# include <avrt.h>
# include <shellapi.h>
#pragma warning(pop)
////////////////////////////////
//~ Window types
typedef i32 P_W32_CursorFlag; enum
{
P_W32_CursorFlag_None = (0 << 0),
P_W32_CursorFlag_Position = (1 << 0),
P_W32_CursorFlag_Hide = (1 << 1),
P_W32_CursorFlag_Show = (1 << 2),
P_W32_CursorFlag_EnableClip = (1 << 3),
P_W32_CursorFlag_DisableClip = (1 << 4)
};
Struct(P_W32_Window)
{
u32 flags;
HWND hwnd;
Counter ready_fence;
u16 utf16_high_surrogate_last_input;
Mutex settings_mutex;
P_WindowSettings settings;
i32 monitor_width;
i32 monitor_height;
/* NOTE: width & height are unaffected by window minimization (they retain
* their pre-minimized values) */
i32 x, y, width, height;
/* FIXME: Use a cmd buffer for updating cursor (and maybe also settings).
* Current setup means cursor_set calls can be applied out of order */
u32 cursor_set_flags;
Vec2 cursor_set_position;
Rect cursor_clip_bounds;
Atomic32 topmost_toggles;
b32 is_topmost;
Mutex event_arena_swp_mutex;
i32 current_event_arena_index;
Arena *event_arenas[2];
W32_Thread *window_thread;
Atomic32 shutdown;
P_W32_Window *next_free;
};
////////////////////////////////
//~ Watch types
Struct(P_W32_Watch)
{
HANDLE dir_handle;
HANDLE wake_handle;
P_W32_Watch *next_free;
u8 results_buff[Kibi(64)];
};
////////////////////////////////
//~ Address types
Struct(P_W32_Address)
{
i32 size;
i32 family;
union
{
struct sockaddr_storage sas;
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
};
};
////////////////////////////////
//~ Sock types
Struct(P_W32_Sock)
{
SOCKET sock;
P_W32_Sock *next_free;
};
////////////////////////////////
//~ Shared state
#define P_W32_WindowClassName L"power_play_window_class"
Struct(P_W32_SharedCtx)
{
//- Key lookup table
P_Btn vk_btn_table[256];
//- Watches pool
Mutex watches_mutex;
Arena *watches_arena;
P_W32_Watch *watches_first_free;
//- Windows pool
WNDCLASSEXW window_class;
Mutex windows_mutex;
Arena *windows_arena;
P_W32_Window *first_free_window;
//- Socket pool
WSADATA wsa_data;
Arena *socks_arena;
Mutex socks_mutex;
P_W32_Sock *first_free_sock;
};
extern P_W32_SharedCtx P_W32_shared_ctx;
////////////////////////////////
//~ Time operations
P_DateTime P_W32_DateTimeFromWin32SystemTime(SYSTEMTIME st);
////////////////////////////////
//~ File system operations
String P_W32_StringFromWin32Path(Arena *arena, wchar_t *src);
////////////////////////////////
//~ Window operations
P_W32_Window *P_W32_AcquireWindow(void);
void P_W32_ReleaseWindow(P_W32_Window *window);
HWND P_W32_InitWindow(P_W32_Window *window);
//- Window settings
void P_W32_UpdateWindowFromSystem(P_W32_Window *window);
void P_W32_UpdateWindowFromSettings(P_W32_Window *window, P_WindowSettings *settings);
//- Window thread
W32_ThreadDef(P_W32_WindowThreadEntryFunc, arg);
void P_W32_ProcessWindowEvent(P_W32_Window *window, P_WindowEvent event);
void P_W32_WakeWindow(P_W32_Window *window);
LRESULT CALLBACK P_W32_Win32WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
////////////////////////////////
//~ Address operations
P_W32_Address P_W32_Win32AddressFromPlatformAddress(P_Address addr);
P_W32_Address P_W32_ConvertAnyaddrToLocalhost(P_W32_Address addr);
P_Address P_W32_PlatformAddressFromWin32Address(P_W32_Address ws_addr);