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