2023-09-08 18:08:57 -07:00
|
|
|
#if __clang__
|
|
|
|
#pragma clang diagnostic push
|
|
|
|
#pragma clang diagnostic ignored "-Wunused-const-variable"
|
|
|
|
#pragma clang diagnostic ignored "-Wswitch"
|
|
|
|
#pragma clang diagnostic ignored "-Wunused-variable"
|
|
|
|
#pragma clang diagnostic ignored "-Wunknown-pragmas"
|
|
|
|
#pragma clang diagnostic ignored "-Wvarargs"
|
|
|
|
#pragma clang diagnostic ignored "-Wunused-function"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "grime.h"
|
|
|
|
#include "macros.h"
|
|
|
|
#include "types.h"
|
|
|
|
|
2023-09-08 14:50:22 -07:00
|
|
|
#include "win32.h"
|
2023-09-08 21:01:53 -07:00
|
|
|
NS_WIN32_BEGIN
|
2023-09-08 18:08:57 -07:00
|
|
|
|
2023-09-08 21:01:53 -07:00
|
|
|
// TODO(Ed) : This is a global for now.
|
|
|
|
global bool Running;
|
|
|
|
|
|
|
|
global BITMAPINFO ScreenBitmapInfo;
|
|
|
|
global void* ScreenBitmapMemory; // Lets use directly mess with the "pixel's memory buffer"
|
|
|
|
global HBITMAP ScreenBitmapHandle;
|
|
|
|
global HDC ScreenDeviceContext;
|
|
|
|
|
|
|
|
internal void
|
|
|
|
resize_dib_section( u32 width, u32 height )
|
|
|
|
{
|
|
|
|
// TODO(Ed) : Bulletproof memory handling here for the bitmap memory
|
|
|
|
|
|
|
|
// TODO(Ed) : Free DIB section
|
|
|
|
|
|
|
|
if ( ScreenBitmapHandle )
|
|
|
|
{
|
|
|
|
DeleteObject( ScreenBitmapHandle );
|
|
|
|
}
|
|
|
|
if ( ! ScreenDeviceContext )
|
|
|
|
{
|
|
|
|
ScreenDeviceContext = CreateCompatibleDC( 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr BITMAPINFOHEADER& header = ScreenBitmapInfo.bmiHeader;
|
|
|
|
header.biSize = sizeof( header );
|
|
|
|
header.biWidth = width;
|
|
|
|
header.biHeight = height;
|
|
|
|
header.biPlanes = 1;
|
|
|
|
header.biBitCount = 32; // Need 24, but want 32 ( alignment )
|
|
|
|
header.biCompression = BI_RGB_Uncompressed;
|
|
|
|
header.biSizeImage = 0;
|
|
|
|
header.biXPelsPerMeter = 0;
|
|
|
|
header.biYPelsPerMeter = 0;
|
|
|
|
header.biClrUsed = 0;
|
|
|
|
header.biClrImportant = 0;
|
|
|
|
ScreenBitmapHandle = CreateDIBSection( ScreenDeviceContext, & ScreenBitmapInfo
|
|
|
|
, DIB_ColorTable_RGB, & ScreenBitmapMemory
|
|
|
|
// Ignoring these last two
|
|
|
|
, 0, 0 );
|
|
|
|
|
|
|
|
// ReleaseContext( 0, ScreenDeviceContext );
|
|
|
|
}
|
|
|
|
|
|
|
|
internal void
|
|
|
|
update_window( HDC device_context
|
|
|
|
, u32 x, u32 y
|
|
|
|
, u32 width, u32 height )
|
|
|
|
{
|
|
|
|
StretchDIBits( device_context
|
|
|
|
, x, y, width, height
|
|
|
|
, x, y, width, height
|
|
|
|
, ScreenBitmapMemory, & ScreenBitmapInfo
|
|
|
|
, DIB_ColorTable_RGB, RO_Source_To_Dest );
|
|
|
|
}
|
|
|
|
|
|
|
|
LRESULT CALLBACK
|
|
|
|
main_window_callback(
|
2023-09-08 18:08:57 -07:00
|
|
|
HWND handle,
|
|
|
|
UINT system_messages,
|
|
|
|
WPARAM w_param,
|
|
|
|
LPARAM l_param
|
|
|
|
)
|
|
|
|
{
|
|
|
|
LRESULT result;
|
|
|
|
|
|
|
|
switch ( system_messages )
|
|
|
|
{
|
|
|
|
case WM_ACTIVATEAPP:
|
|
|
|
{
|
|
|
|
OutputDebugStringA( "WM_ACTIVATEAPP\n" );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_CLOSE:
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
// TODO(Ed) : Handle with a message to the user
|
|
|
|
Running = false;
|
2023-09-08 18:08:57 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_DESTROY:
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
// TODO(Ed) : Handle with as an error and recreate the window
|
|
|
|
Running = false;
|
2023-09-08 18:08:57 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_PAINT:
|
|
|
|
{
|
|
|
|
PAINTSTRUCT info;
|
|
|
|
HDC device_context = BeginPaint( handle, & info );
|
|
|
|
|
2023-09-08 21:01:53 -07:00
|
|
|
|
2023-09-08 18:08:57 -07:00
|
|
|
u32 x = info.rcPaint.left;
|
|
|
|
u32 y = info.rcPaint.top;
|
|
|
|
u32 height = info.rcPaint.bottom - info.rcPaint.top;
|
|
|
|
u32 width = info.rcPaint.right - info.rcPaint.left;
|
|
|
|
|
2023-09-08 21:01:53 -07:00
|
|
|
update_window( handle
|
2023-09-08 18:08:57 -07:00
|
|
|
, x, y
|
2023-09-08 21:01:53 -07:00
|
|
|
, width, height );
|
2023-09-08 18:08:57 -07:00
|
|
|
|
|
|
|
EndPaint( handle, & info );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_SIZE:
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
RECT client_rect;
|
|
|
|
GetClientRect( handle, & client_rect );
|
|
|
|
|
|
|
|
u32 width = client_rect.right - client_rect.left;
|
|
|
|
u32 height = client_rect.bottom - client_rect.top;
|
|
|
|
|
|
|
|
resize_dib_section( width, height );
|
2023-09-08 18:08:57 -07:00
|
|
|
OutputDebugStringA( "WM_SIZE\n" );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
OutputDebugStringA( "default\n" );
|
|
|
|
result = DefWindowProc( handle, system_messages, w_param, l_param );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
2023-09-08 21:01:53 -07:00
|
|
|
NS_WIN32_END
|
2023-09-08 12:14:09 -07:00
|
|
|
|
2023-09-08 21:01:53 -07:00
|
|
|
int CALLBACK
|
|
|
|
WinMain(
|
2023-09-08 18:08:57 -07:00
|
|
|
HINSTANCE instance,
|
|
|
|
HINSTANCE prev_instance,
|
|
|
|
LPSTR commandline,
|
|
|
|
int show_command
|
2023-09-08 14:50:22 -07:00
|
|
|
)
|
2023-09-08 12:14:09 -07:00
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
using namespace win32;
|
|
|
|
MessageBox( 0, L"First message!", L"Handmade Hero", MB_Ok_Btn | MB_Icon_Information );
|
2023-09-08 18:08:57 -07:00
|
|
|
|
|
|
|
WNDCLASS window_class {};
|
|
|
|
window_class.style = CS_Own_Device_Context | CS_Horizontal_Redraw | CS_Vertical_Redraw;
|
2023-09-08 21:01:53 -07:00
|
|
|
window_class.lpfnWndProc = main_window_callback;
|
2023-09-08 18:08:57 -07:00
|
|
|
// window_class.cbClsExtra = ;
|
|
|
|
// window_class.cbWndExtra = ;
|
|
|
|
window_class.hInstance = instance;
|
|
|
|
// window_class.hIcon = ;
|
|
|
|
// window_class.hCursor = ;
|
|
|
|
// window_class.hbrBackground = ;
|
|
|
|
window_class.lpszMenuName = L"Handmade Hero!";
|
|
|
|
window_class.lpszClassName = L"HandmadeHeroWindowClass";
|
|
|
|
|
|
|
|
if ( RegisterClassW( &window_class ) )
|
|
|
|
{
|
|
|
|
HWND window_handle = CreateWindowExW(
|
|
|
|
0,
|
|
|
|
window_class.lpszClassName,
|
|
|
|
L"Handmade Hero",
|
|
|
|
WS_Overlapped_Window | WS_Initially_Visible,
|
|
|
|
CW_USEDEFAULT, CW_USEDEFAULT, // x, y
|
|
|
|
CW_USEDEFAULT, CW_USEDEFAULT, // width, height
|
|
|
|
0, 0, // parent, menu
|
|
|
|
instance, 0 // instance, param
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( window_handle )
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
Running = true;
|
2023-09-08 18:08:57 -07:00
|
|
|
|
|
|
|
MSG message;
|
2023-09-08 21:01:53 -07:00
|
|
|
while( Running )
|
2023-09-08 18:08:57 -07:00
|
|
|
{
|
|
|
|
BOOL msg_result = GetMessage( & message, 0, 0, 0 );
|
|
|
|
if ( msg_result > 0 )
|
|
|
|
{
|
|
|
|
TranslateMessage( & message );
|
|
|
|
DispatchMessage( & message );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
// TODO(Ed) : Logging
|
2023-09-08 18:08:57 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-09-08 21:01:53 -07:00
|
|
|
// TODO(Ed) : Logging
|
2023-09-08 18:08:57 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// TODO(Ed) : Logging
|
|
|
|
}
|
2023-09-08 15:54:16 -07:00
|
|
|
|
2023-09-08 12:14:09 -07:00
|
|
|
return 0;
|
|
|
|
}
|