2 * freeglut_init_mswin.c
4 * The Windows-specific mouse cursor related stuff.
6 * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
7 * Written by John F. Fay, <fayjf@sourceforge.net>
8 * Creation date: Thu Jan 19, 2012
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #define FREEGLUT_BUILDING_LIB
29 #include <GL/freeglut.h>
30 #include "../Common/freeglut_internal.h"
34 extern LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg,
35 WPARAM wParam, LPARAM lParam );
39 * A call to this function should initialize all the display stuff...
41 void fgPlatformInitialize( const char* displayName )
46 /* What we need to do is to initialize the fgDisplay global structure here. */
47 fgDisplay.pDisplay.Instance = GetModuleHandle( NULL );
48 fgDisplay.pDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;
49 atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );
53 ZeroMemory( &wc, sizeof(WNDCLASS) );
56 * Each of the windows should have its own device context, and we
57 * want redraw events during Vertical and Horizontal Resizes by
60 * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the
61 * XXX future? Dead-end idea?
63 wc.lpfnWndProc = fgPlatformWindowProc;
66 wc.hInstance = fgDisplay.pDisplay.Instance;
67 wc.hIcon = LoadIcon( fgDisplay.pDisplay.Instance, _T("GLUT_ICON") );
69 #if defined(_WIN32_WCE)
70 wc.style = CS_HREDRAW | CS_VREDRAW;
72 wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
74 wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
77 wc.hCursor = LoadCursor( NULL, IDC_ARROW );
78 wc.hbrBackground = NULL;
79 wc.lpszMenuName = NULL;
80 wc.lpszClassName = _T("FREEGLUT");
82 /* Register the window class */
83 atom = RegisterClass( &wc );
84 FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fgPlatformInitialize" );
87 /* The screen dimensions can be obtained via GetSystemMetrics() calls */
88 fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );
89 fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
92 HWND desktop = GetDesktopWindow( );
93 HDC context = GetDC( desktop );
95 fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
96 fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
98 ReleaseDC( desktop, context );
100 /* If we have a DisplayName try to use it for metrics */
101 if( fgDisplay.pDisplay.DisplayName )
103 HDC context = CreateDC(fgDisplay.pDisplay.DisplayName,0,0,0);
106 fgDisplay.ScreenWidth = GetDeviceCaps( context, HORZRES );
107 fgDisplay.ScreenHeight = GetDeviceCaps( context, VERTRES );
108 fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
109 fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
113 fgWarning("fgPlatformInitialize: "
114 "CreateDC failed, Screen size info may be incorrect\n"
115 "This is quite likely caused by a bad '-display' parameter");
118 /* Set the timer granularity to 1 ms */
119 timeBeginPeriod ( 1 );
122 fgState.Initialised = GL_TRUE;
124 /* Avoid registering atexit callback on Win32 as it results in an access
125 * violation due to calling into a module which has been unloaded.
126 * Any cleanup isn't needed on Windows anyway, the OS takes care of it.c
127 * see: http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx
129 /* atexit(fgDeinitialize); */
131 /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
132 fgInitialiseInputDevices();
137 /* Platform-Specific Deinitialization Functions: */
138 extern void fghCloseInputDevices ( void );
140 void fgPlatformDeinitialiseInputDevices ( void )
142 #if !defined(_WIN32_WCE)
143 fghCloseInputDevices ();
144 #endif /* !defined(_WIN32_WCE) */
145 fgState.JoysticksInitialised = GL_FALSE;
146 fgState.InputDevsInitialised = GL_FALSE;
149 void fgPlatformCloseDisplay ( void )
151 if( fgDisplay.pDisplay.DisplayName )
153 free( fgDisplay.pDisplay.DisplayName );
154 fgDisplay.pDisplay.DisplayName = NULL;
157 /* Reset the timer granularity */
161 void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext )
163 /* Do nothing -- this is required for X11 */
167 * Everything down to the end of the next two functions is copied from the X sources.
172 Copyright 1985, 1986, 1987,1998 The Open Group
174 Permission to use, copy, modify, distribute, and sell this software and its
175 documentation for any purpose is hereby granted without fee, provided that
176 the above copyright notice appear in all copies and that both that
177 copyright notice and this permission notice appear in supporting
180 The above copyright notice and this permission notice shall be included
181 in all copies or substantial portions of the Software.
183 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
184 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
185 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
186 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
187 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
188 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
189 OTHER DEALINGS IN THE SOFTWARE.
191 Except as contained in this notice, the name of The Open Group shall
192 not be used in advertising or otherwise to promote the sale, use or
193 other dealings in this Software without prior written authorization
198 /* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
200 void (__cdecl *__glutExitFunc)( int return_value ) = NULL;
202 void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) )
204 __glutExitFunc = exit_function;
205 glutInit(pargc, argv);