Added (though commented out) support for setting window position
[freeglut] / src / blackberry / fg_window_blackberry.c
1 /*
2  * fg_window_blackberry.c
3  *
4  * Window management methods for BlackBerry
5  *
6  * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
7  * Written by Pawel W. Olszta, <olszta@sourceforge.net>
8  * Copied for Platform code by Evan Felix <karcaw at gmail.com>
9  * Copyright (C) 2012  Sylvain Beucler
10  * Copyright (C) 2013  Vincent Simonetti
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25  * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
26  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28  */
29
30 #define FREEGLUT_BUILDING_LIB
31 #include <GL/freeglut.h>
32 #include "fg_internal.h"
33 #include "egl/fg_window_egl.h"
34 #include <screen/screen.h>
35 #include <bps/screen.h>
36
37 /*
38  * Opens a window. Requires a SFG_Window object created and attached
39  * to the freeglut structure. OpenGL context is created here.
40  */
41 void fgPlatformOpenWindow( SFG_Window* window, const char* title,
42                            GLboolean positionUse, int x, int y,
43                            GLboolean sizeUse, int w, int h,
44                            GLboolean gameMode, GLboolean isSubWindow )
45 {
46     /* TODO: only one full-screen window possible? */
47     if (fgDisplay.pDisplay.single_native_window != NULL) {
48         fgWarning("You can't have more than one window on BlackBerry");
49         return;
50     }
51
52     /* Create window */
53     screen_window_t sWindow;
54     if (screen_create_window(&sWindow, fgDisplay.pDisplay.screenContext)) {
55         fgError("Could not create window");
56         return;
57     }
58     fgDisplay.pDisplay.single_native_window = sWindow;
59
60     /* Set window properties */
61     int screenFormat = SCREEN_FORMAT_RGBA8888; //XXX Should this be determined by config?
62 #ifdef GL_ES_VERSION_2_0
63     int screenUsage = SCREEN_USAGE_OPENGL_ES2;
64 #elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1
65     int screenUsage = SCREEN_USAGE_OPENGL_ES1;
66 #endif
67 #ifndef __X86__
68     screenUsage |= SCREEN_USAGE_DISPLAY; // Physical device copy directly into physical display
69 #endif
70     if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_FORMAT, &screenFormat)) {
71         screen_destroy_window(sWindow);
72         fgError("Could not set window format");
73         return;
74     }
75     if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_USAGE, &screenUsage)) {
76         screen_destroy_window(sWindow);
77         fgError("Could not set window usage");
78         return;
79     }
80
81     /* Uncomment when multiple windows are supported
82     int value[2];
83     if(positionUse) {
84         value[0] = x;
85         value[1] = y;
86         if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_POSITION, value)) {
87             screen_destroy_window(sWindow);
88             fgError("Could not set window position");
89             return;
90         }
91     }
92
93     if(sizeUse) {
94         value[0] = w;
95         value[1] = h;
96         if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
97             screen_destroy_window(sWindow);
98             fgError("Could not set window buffer size");
99             return;
100         }
101     }*/
102
103     /* Create window buffers */
104     if (screen_create_window_buffers(sWindow, (fgState.DisplayMode & GLUT_DOUBLE) ? 2 : 1)) {
105         screen_destroy_window(sWindow);
106         fgError("Could not create window buffers");
107         return;
108     }
109
110     /* Save window and set state */
111     window->Window.Handle = fgDisplay.pDisplay.single_native_window;
112     window->State.WorkMask |= GLUT_INIT_WORK;
113     window->State.IsFullscreen = GL_TRUE; //XXX Always fullscreen for now
114
115     /* Create context */
116     fghChooseConfig(&window->Window.pContext.egl.Config);
117     window->Window.Context = fghCreateNewContextEGL(window);
118
119     /* Create EGL window */
120     fghPlatformOpenWindowEGL(window);
121
122     window->State.Visible = GL_TRUE;
123 }
124
125 /*
126  * Request a window resize
127  */
128 void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
129 {
130     fprintf(stderr, "fgPlatformReshapeWindow: STUB\n");
131 }
132
133 /*
134  * Closes a window, destroying the frame and OpenGL context
135  */
136 void fgPlatformCloseWindow( SFG_Window* window )
137 {
138     fghPlatformCloseWindowEGL(window);
139
140     screen_destroy_window((screen_window_t)window->Window.Handle);
141 }
142
143 /*
144  * This function makes the specified window visible
145  */
146 void fgPlatformShowWindow( void )
147 {
148     fprintf(stderr, "fgPlatformShowWindow: STUB\n");
149 }
150
151 /*
152  * This function hides the specified window
153  */
154 void fgPlatformHideWindow( SFG_Window *window )
155 {
156     fprintf(stderr, "fgPlatformHideWindow: STUB\n");
157 }
158
159 /*
160  * Iconify the specified window (top-level windows only)
161  */
162 void fgPlatformIconifyWindow( SFG_Window *window )
163 {
164     //XXX This is possible via Cascades, but can't seem to find a C-level API
165     fprintf(stderr, "fgPlatformGlutIconifyWindow: STUB\n");
166 }
167
168 /*
169  * Set the current window's title
170  */
171 void fgPlatformGlutSetWindowTitle( const char* title )
172 {
173     fprintf(stderr, "fgPlatformGlutSetWindowTitle: STUB\n");
174 }
175
176 /*
177  * Set the current window's iconified title
178  */
179 void fgPlatformGlutSetIconTitle( const char* title )
180 {
181     fprintf(stderr, "fgPlatformGlutSetIconTitle: STUB\n");
182 }
183
184 /*
185  * Change the specified window's position
186  */
187 void fgPlatformPositionWindow( SFG_Window *window, int x, int y )
188 {
189     fprintf(stderr, "fgPlatformPositionWindow: STUB\n");
190 }
191
192 /*
193  * Lowers the specified window (by Z order change)
194  */
195 void fgPlatformPushWindow( SFG_Window *window )
196 {
197     fprintf(stderr, "fgPlatformPushWindow: STUB\n");
198 }
199
200 /*
201  * Raises the specified window (by Z order change)
202  */
203 void fgPlatformPopWindow( SFG_Window *window )
204 {
205     fprintf(stderr, "fgPlatformPopWindow: STUB\n");
206 }
207
208 /*
209  * Toggle the window's full screen state.
210  */
211 void fgPlatformFullScreenToggle( SFG_Window *win )
212 {
213     fprintf(stderr, "fgPlatformFullScreenToggle: STUB\n");
214 }