summaryrefslogtreecommitdiffstats
path: root/make/wgl-CustomCCode.c
diff options
context:
space:
mode:
Diffstat (limited to 'make/wgl-CustomCCode.c')
-rwxr-xr-xmake/wgl-CustomCCode.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/make/wgl-CustomCCode.c b/make/wgl-CustomCCode.c
new file mode 100755
index 000000000..be233fd9a
--- /dev/null
+++ b/make/wgl-CustomCCode.c
@@ -0,0 +1,99 @@
+#include <stdio.h>
+
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
+ATOM oglClass = 0;
+
+HWND CreateDummyWindow( int x, int y, int width, int height ) {
+ RECT rect;
+ HINSTANCE hInstance;
+ DWORD dwExStyle;
+ DWORD dwStyle;
+ HWND hWnd;
+ ZeroMemory( &rect, sizeof( rect ) );
+ // I don't know if we need this but it can't hurt
+ if( width < 0 ) {
+ rect.left = x + width;
+ rect.right = x;
+ } else {
+ rect.left = x;
+ rect.right = x + width;
+ }
+ if( height < 0 ) {
+ rect.top = y + height;
+ rect.bottom = y;
+ } else {
+ rect.top = y;
+ rect.bottom = y + height;
+ }
+ hInstance = GetModuleHandle(NULL);
+
+ if( !oglClass ) {
+ WNDCLASS wc;
+ ZeroMemory( &wc, sizeof( wc ) );
+ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+ wc.lpfnWndProc = (WNDPROC) WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInstance;
+ wc.hIcon = NULL;
+ wc.hCursor = NULL;
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = "OpenGL";
+ if( !(oglClass = RegisterClass( &wc )) ) {
+ printf( "RegisterClass Failed: %d\n", GetLastError() );
+ return( 0 );
+ }
+ }
+
+ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ dwStyle = WS_OVERLAPPEDWINDOW;
+ if( !(hWnd=CreateWindowEx( dwExStyle, "OpenGL", "OpenGL",
+ dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+ rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
+ NULL, NULL, hInstance, NULL ) ) ) {
+ return( 0 );
+ }
+ return( hWnd );
+}
+
+void NativeEventLoop() {
+ MSG msg;
+ BOOL ret;
+ // Grab windows system messages from queue
+ while( ( ret = GetMessage( &msg, NULL, 0, 0 ) ) != 0 ) {
+ if( ret == -1 ) {
+ printf( "Error GetMessage: %d", GetLastError() );
+ } else {
+ DispatchMessage( &msg );
+ }
+ }
+}
+
+void DestroyDummyWindow(HWND handle, HDC hdc) {
+ // Post a close window message from shutdown hook thread to
+ // window message pump thread
+ if( !PostMessage( handle, WM_CLOSE, 0, (LPARAM) hdc ) ) {
+ printf( "PostMessage Failed: %d\n", GetLastError() );
+ }
+}
+
+LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+ switch( uMsg ) {
+ case WM_CLOSE:
+ // Destroy HDC
+ if( ReleaseDC( hWnd, (HDC) lParam ) != 1 ) {
+ printf( "Error Releasing DC: %d\n", GetLastError() );
+ }
+ // Destroy HWND
+ if( DestroyWindow( hWnd ) == 0 ) {
+ printf( "Error Destroying Window: %d\n", GetLastError() );
+ }
+ break;
+ case WM_DESTROY:
+ // Terminate Dummy Window
+ PostQuitMessage(0);
+ return(0);
+ }
+ return DefWindowProc(hWnd,uMsg,wParam,lParam);
+}