3e5228d9519eefb836c7e7241e8b8c29f9d59454
[freeglut] / src / mswin / fg_gamemode_mswin.c
1 /*
2  * freeglut_gamemode_mswin.c
3  *
4  * The Windows-specific mouse cursor related stuff.
5  *
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
9  *
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:
16  *
17  * The above copyright notice and this permission notice shall be included
18  * in all copies or substantial portions of the Software.
19  *
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.
26  */
27
28 #include <GL/freeglut.h>
29 #include "../fg_internal.h"
30
31 /*
32  * Remembers the current visual settings, so that
33  * we can change them and restore later...
34  */
35 void fgPlatformRememberState( void )
36 {
37     /* Grab the current desktop settings... */
38
39     /* hack to get around my stupid cross-gcc headers */
40     #define FREEGLUT_ENUM_CURRENT_SETTINGS -1
41
42     EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,
43                          &fgDisplay.pDisplay.DisplayMode );
44
45     /* Make sure we will be restoring all settings needed */
46     fgDisplay.pDisplay.DisplayMode.dmFields |=
47         DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
48
49 }
50
51 /*
52  * Restores the previously remembered visual settings
53  */
54 void fgPlatformRestoreState( void )
55 {
56     /* Restore the previously remembered desktop display settings */
57     ChangeDisplaySettingsEx( fgDisplay.pDisplay.DisplayName,&fgDisplay.pDisplay.DisplayMode, 0,0,0 );
58 }
59
60
61
62
63 /*
64  * Changes the current display mode to match user's settings
65  */
66 GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest )
67 {
68     GLboolean success = GL_FALSE;
69     DEVMODE  devMode;
70     char *fggmstr = NULL;
71     char displayMode[300];
72
73     success = GL_FALSE;
74
75     EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, -1, &devMode ); 
76     devMode.dmFields = 0;
77
78     if (fgState.GameModeSize.X!=-1)
79     {
80         devMode.dmPelsWidth  = fgState.GameModeSize.X;
81         devMode.dmFields |= DM_PELSWIDTH;
82     }
83     if (fgState.GameModeSize.Y!=-1)
84     {
85         devMode.dmPelsHeight  = fgState.GameModeSize.Y;
86         devMode.dmFields |= DM_PELSHEIGHT;
87     }
88     if (fgState.GameModeDepth!=-1)
89     {
90         devMode.dmBitsPerPel  = fgState.GameModeDepth;
91         devMode.dmFields |= DM_BITSPERPEL;
92     }
93     if (fgState.GameModeRefresh!=-1)
94     {
95         devMode.dmDisplayFrequency  = fgState.GameModeRefresh;
96         devMode.dmFields |= DM_DISPLAYFREQUENCY;
97     }
98
99     switch ( ChangeDisplaySettingsEx(fgDisplay.pDisplay.DisplayName, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) )
100     {
101     case DISP_CHANGE_SUCCESSFUL:
102         success = GL_TRUE;
103
104         if (!haveToTest)
105         {
106             /* update vars in case if windows switched to proper mode */
107             EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode );
108             fgState.GameModeSize.X  = devMode.dmPelsWidth;        
109             fgState.GameModeSize.Y  = devMode.dmPelsHeight;
110             fgState.GameModeDepth   = devMode.dmBitsPerPel;
111             fgState.GameModeRefresh = devMode.dmDisplayFrequency;
112         }
113                 break;
114     case DISP_CHANGE_RESTART:
115         fggmstr = "The computer must be restarted for the graphics mode to work.";
116         break;
117     case DISP_CHANGE_BADFLAGS:
118         fggmstr = "An invalid set of flags was passed in.";
119         break;
120     case DISP_CHANGE_BADPARAM:
121         fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags.";
122         break;
123     case DISP_CHANGE_FAILED:
124         fggmstr = "The display driver failed the specified graphics mode.";
125         break;
126     case DISP_CHANGE_BADMODE:
127         fggmstr = "The graphics mode is not supported.";
128         break;
129     default:
130         fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible,MSDN does not mention any other error */
131         break;
132     }
133
134     if ( !success )
135     {
136         /* I'd rather get info whats going on in my program than wonder about */
137         /* magic happenings behind my back, its lib for devels at last ;) */
138         
139         /* append display mode to error to make things more informative */
140         sprintf(displayMode,"%s Problem with requested mode: %ix%i:%i@%i", fggmstr, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmDisplayFrequency);
141         fgWarning(displayMode);
142     }
143
144     return success;
145 }
146
147 void fgPlatformEnterGameMode( void ) 
148 {
149 }
150
151 void fgPlatformLeaveGameMode( void ) 
152 {
153 }