Gears-C/src/platform/platform_windows.c

214 lines
3.7 KiB
C

HINSTANCE win32_instance = {0};
PlatformWindow win32_window = {0};
b32 global_quit = false;
LRESULT CALLBACK WindowProc(HWND window, UINT message, WPARAM w_param, LPARAM l_param)
{
LRESULT result = 0;
switch (message)
{
case WM_SIZE:
{
Printfln("Window resizing");
win32_window.w = LOWORD(l_param);
win32_window.h = HIWORD(l_param);
SetRenderResolution(win32_window.w, win32_window.h);
} break;
case WM_DESTROY: // TODO(MA): Probably handle these separately but for now, they're together
case WM_CLOSE:
{
Printf("quitting");
global_quit = true;
} break;
case WM_ACTIVATEAPP:
{
OutputDebugStringA("WM_ACTIVATEAPP\n");
} break;
default:
{
result = DefWindowProc(window, message, w_param, l_param);
} break;
}
return result;
}
b32 LoadLib(const char *name, Library *out_lib)
{
b32 success = true;
out_lib->module = LoadLibraryA("vulkan-1.dll");
if (!out_lib->module)
success = false;
return success;
}
b32 LoadFn(const char *name, Library *lib, Function *out_fn)
{
b32 success = true;
out_fn->fn = GetProcAddress(lib->module, name);
if (!out_fn->fn)
success = false;
return success;
}
rawptr _MemAlloc(isize size)
{
return (rawptr)VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
}
rawptr _MemAllocZeroed(isize size)
{
return _MemAlloc(size);
}
isize _GetPageSize()
{
return 0;
}
i32 _Write(void const *str, DWORD std_handle)
{
DWORD written;
BOOL success = WriteFile(GetStdHandle(std_handle), str, StrLen(str), &written, NULL);
return success ? (i32)written : -1;
}
i32 _Printf(const char *fmt, va_list arg)
{
char buffer[1024];
int sprf_res = stbsp_vsnprintf(&buffer[0], 1024, fmt, arg);
i32 pr_res;
if (sprf_res < 0)
pr_res = sprf_res;
else
pr_res = _Write(buffer, STD_OUTPUT_HANDLE);
return pr_res;
}
i32 _Printfln(const char *fmt, va_list arg)
{
char buffer[1024];
int sprf_res = stbsp_vsnprintf(&buffer[0], 1023, fmt, arg);
i32 pr_res;
if (sprf_res < 0)
pr_res = sprf_res;
else
{
buffer[sprf_res] = '\n';
buffer[sprf_res+1] = '\0';
pr_res = _Write(&buffer, STD_OUTPUT_HANDLE);
}
return pr_res;
}
i32 _EPrint(void const *str)
{
return _Write(str, STD_ERROR_HANDLE);
}
i32 _EPrintf(const char *fmt, va_list arg)
{
char buffer[1024];
int sprf_res = stbsp_vsnprintf(&buffer[0], 1024, fmt, arg);
if (sprf_res < 0) return sprf_res;
return EPrint(&buffer);
}
b32 CreatePlatformWindow(const char *window_name)
{
b32 success = true;
WNDCLASS window_class = {
.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW,
.lpfnWndProc = WindowProc,
.hInstance = win32_instance,
.lpszClassName = WINDOW_CLASS_NAME,
};
ATOM r_class_atom = RegisterClass(&window_class);
if (!r_class_atom)
success = false;
if (success)
{
HWND window_handle = CreateWindowExA(
0,
window_class.lpszClassName,
window_name,
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
win32_instance,
0
);
if (!window_handle)
success = false;
else
win32_window.handle = window_handle;
}
return success;
}
PlatformWindow *GetPlatformWindow()
{
return &win32_window;
}
void GetWindowEvents()
{
BOOL has_msg = false;
MSG message;
do
{
has_msg = PeekMessage(&message, 0, 0, 0, PM_REMOVE);
if (has_msg > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
while (has_msg);
}
void WaitForWindowEvent()
{
MSG message;
BOOL message_result = GetMessageA(&message, 0, 0, 0);
if (message_result > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
b32 ShouldQuit()
{
return global_quit;
}
WindowSize _GetWindowSize()
{
return (WindowSize){ .w = win32_window.w, .h = win32_window.h };
}