2 * Mesa 3-D graphics library
4 * Copyright (C) 1995-1998 Brian Paul
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * DOS/DJGPP glut driver v1.5 for Mesa
24 * Copyright (C) 2002 - Daniel Borca
25 * Email : dborca@users.sourceforge.net
26 * Web : http://www.geocities.com/dborca
34 #define DEFAULT_WIDTH 300
35 #define DEFAULT_HEIGHT 300
36 #define DEFAULT_BPP 16
40 #define STENCIL_SIZE 8
44 GLuint g_bpp
= DEFAULT_BPP
;
45 GLuint g_alpha
= ALPHA_SIZE
;
46 GLuint g_depth
= DEPTH_SIZE
;
47 GLuint g_stencil
= STENCIL_SIZE
;
48 GLuint g_accum
= ACCUM_SIZE
;
50 GLuint g_screen_w
, g_screen_h
;
55 GLuint g_display_mode
= 0;
56 int g_init_x
= 0, g_init_y
= 0;
57 GLuint g_init_w
= DEFAULT_WIDTH
, g_init_h
= DEFAULT_HEIGHT
;
59 char *__glutProgramName
= NULL
;
63 glutInit (int *argc
, char **argv
)
68 if ((env
= getenv("DMESA_GLUT_BPP")) != NULL
) {
71 if ((env
= getenv("DMESA_GLUT_ALPHA")) != NULL
) {
74 if ((env
= getenv("DMESA_GLUT_DEPTH")) != NULL
) {
77 if ((env
= getenv("DMESA_GLUT_STENCIL")) != NULL
) {
78 g_stencil
= atoi(env
);
80 if ((env
= getenv("DMESA_GLUT_ACCUM")) != NULL
) {
83 if ((env
= getenv("DMESA_GLUT_REFRESH")) != NULL
) {
84 g_refresh
= atoi(env
);
87 /* Determine program name. */
88 str
= strrchr(argv
[0], '/');
94 __glutProgramName
= __glutStrdup(str
);
96 /* check if GLUT_FPS env var is set */
97 if ((env
= getenv("GLUT_FPS")) != NULL
) {
98 if ((g_fps
= atoi(env
)) <= 0) {
99 g_fps
= 5000; /* 5000 milliseconds */
103 /* Initialize timer */
104 glutGet(GLUT_ELAPSED_TIME
);
109 glutInitDisplayMode (unsigned int mode
)
111 g_display_mode
= mode
;
116 glutInitWindowPosition (int x
, int y
)
124 glutInitWindowSize (int width
, int height
)
131 #define DO_REDISPLAY(w, ccin, ccout) \
133 if (w->redisplay && w->display) { \
137 w->redisplay = GL_FALSE; \
139 /* test IN condition (whether we need to `MakeCurrent') */\
141 rv = DMesaMakeCurrent(w->context, w->buffer); \
144 /* do the display only if `MakeCurrent' didn't failed */ \
146 if (w->show_mouse && !(g_display_mode & GLUT_DOUBLE)) {\
147 /* XXX scare mouse */ \
149 /* XXX unscare mouse */ \
154 /* update OUT condition */ \
167 static int old_mouse_x
= 0;
168 static int old_mouse_y
= 0;
169 static int old_mouse_b
= 0;
172 GLint screen_size
[2];
173 DMesaGetIntegerv(DMESA_GET_SCREEN_SIZE
, screen_size
);
174 g_screen_w
= screen_size
[0];
175 g_screen_h
= screen_size
[1];
176 DMesaGetIntegerv(DMESA_GET_DRIVER_CAPS
, &g_driver_caps
);
182 for (i
= 0; i
< MAX_WINDOWS
; i
++) {
185 glutSetWindow(w
->num
);
188 w
->reshape(w
->width
, w
->height
);
191 w
->visibility(GLUT_VISIBLE
);
200 for (i
= 0; i
< MAX_WINDOWS
; i
++) {
202 if ((w
!= NULL
) && (w
!= g_curwin
)) {
204 * 2) `MakeCurrent' always
205 * 3) update number of non-default windows
207 DO_REDISPLAY(w
, GL_TRUE
, n
++);
210 /* 1) redisplay `g_curwin'
211 * 2) `MakeCurrent' only if we previously did non-default windows
212 * 3) don't update anything
214 DO_REDISPLAY(g_curwin
, n
, n
);
223 mouse_b
= pc_query_mouse(&mouse_x
, &mouse_y
, &mouse_z
);
225 /* relative to window coordinates */
226 g_mouse_x
= mouse_x
- g_curwin
->xpos
;
227 g_mouse_y
= mouse_y
- g_curwin
->ypos
;
229 /* mouse was moved? */
230 if ((mouse_x
!= old_mouse_x
) || (mouse_y
!= old_mouse_y
)) {
232 old_mouse_x
= mouse_x
;
233 old_mouse_y
= mouse_y
;
236 /* any button pressed */
237 if (g_curwin
->motion
) {
238 g_curwin
->motion(g_mouse_x
, g_mouse_y
);
241 /* no button pressed */
242 if (g_curwin
->passive
) {
243 g_curwin
->passive(g_mouse_x
, g_mouse_y
);
248 /* button state changed? */
249 if (mouse_b
!= old_mouse_b
) {
250 GLUTmouseCB mouse_func
;
252 if ((mouse_func
= g_curwin
->mouse
)) {
253 if ((old_mouse_b
& 1) && !(mouse_b
& 1))
254 mouse_func(GLUT_LEFT_BUTTON
, GLUT_UP
, g_mouse_x
, g_mouse_y
);
255 else if (!(old_mouse_b
& 1) && (mouse_b
& 1))
256 mouse_func(GLUT_LEFT_BUTTON
, GLUT_DOWN
, g_mouse_x
, g_mouse_y
);
258 if ((old_mouse_b
& 2) && !(mouse_b
& 2))
259 mouse_func(GLUT_RIGHT_BUTTON
, GLUT_UP
, g_mouse_x
, g_mouse_y
);
260 else if (!(old_mouse_b
& 2) && (mouse_b
& 2))
261 mouse_func(GLUT_RIGHT_BUTTON
, GLUT_DOWN
, g_mouse_x
, g_mouse_y
);
263 if ((old_mouse_b
& 4) && !(mouse_b
& 4))
264 mouse_func(GLUT_MIDDLE_BUTTON
, GLUT_UP
, g_mouse_x
, g_mouse_y
);
265 else if (!(old_mouse_b
& 3) && (mouse_b
& 4))
266 mouse_func(GLUT_MIDDLE_BUTTON
, GLUT_DOWN
, g_mouse_x
, g_mouse_y
);
270 old_mouse_b
= mouse_b
;
274 if (pc_keypressed()) {
282 case KEY_F1
: glut_key
= GLUT_KEY_F1
; goto special
;
283 case KEY_F2
: glut_key
= GLUT_KEY_F2
; goto special
;
284 case KEY_F3
: glut_key
= GLUT_KEY_F3
; goto special
;
285 case KEY_F4
: glut_key
= GLUT_KEY_F4
; goto special
;
286 case KEY_F5
: glut_key
= GLUT_KEY_F5
; goto special
;
287 case KEY_F6
: glut_key
= GLUT_KEY_F6
; goto special
;
288 case KEY_F7
: glut_key
= GLUT_KEY_F7
; goto special
;
289 case KEY_F8
: glut_key
= GLUT_KEY_F8
; goto special
;
290 case KEY_F9
: glut_key
= GLUT_KEY_F9
; goto special
;
291 case KEY_F10
: glut_key
= GLUT_KEY_F10
; goto special
;
292 case KEY_F11
: glut_key
= GLUT_KEY_F11
; goto special
;
293 case KEY_F12
: glut_key
= GLUT_KEY_F12
; goto special
;
294 case KEY_LEFT
: glut_key
= GLUT_KEY_LEFT
; goto special
;
295 case KEY_UP
: glut_key
= GLUT_KEY_UP
; goto special
;
296 case KEY_RIGHT
: glut_key
= GLUT_KEY_RIGHT
; goto special
;
297 case KEY_DOWN
: glut_key
= GLUT_KEY_DOWN
; goto special
;
298 case KEY_PGUP
: glut_key
= GLUT_KEY_PAGE_UP
; goto special
;
299 case KEY_PGDN
: glut_key
= GLUT_KEY_PAGE_DOWN
; goto special
;
300 case KEY_HOME
: glut_key
= GLUT_KEY_HOME
; goto special
;
301 case KEY_END
: glut_key
= GLUT_KEY_END
; goto special
;
302 case KEY_INSERT
: glut_key
= GLUT_KEY_INSERT
; goto special
;
304 if (g_curwin
->special
) {
305 g_curwin
->special(glut_key
, g_mouse_x
, g_mouse_y
);
309 if (g_curwin
->keyboard
) {
310 g_curwin
->keyboard(key
& 0xFF, g_mouse_x
, g_mouse_y
);
315 if (idle
&& g_idle_func
)
318 for (i
= 0; i
< MAX_SSHOT_CB
; i
++) {
319 int time
= glutGet(GLUT_ELAPSED_TIME
);
320 GLUTSShotCB
*cb
= &g_sscb
[i
];
321 if (cb
->func
&& (time
>= cb
->time
)) {