DOS updates (Daniel Borca)
[mesa.git] / src / glut / dos / init.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 4.0
4 * Copyright (C) 1995-1998 Brian Paul
5 *
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.
10 *
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.
15 *
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.
19 */
20
21 /*
22 * DOS/DJGPP glut driver v1.3 for Mesa 5.0
23 *
24 * Copyright (C) 2002 - Borca Daniel
25 * Email : dborca@yahoo.com
26 * Web : http://www.geocities.com/dborca
27 */
28
29
30 #include <string.h>
31
32 #include "glutint.h"
33
34
35
36 GLboolean g_redisplay = GL_FALSE;
37
38 GLuint g_bpp = DEFAULT_BPP;
39 GLuint g_refresh = 0;
40 GLuint g_screen_w, g_screen_h;
41
42 GLuint g_display_mode = 0;
43 int g_init_x = 0, g_init_y = 0;
44 GLuint g_init_w = DEFAULT_WIDTH, g_init_h = DEFAULT_HEIGHT;
45
46 char *__glutProgramName = NULL;
47
48
49
50 void APIENTRY glutInit (int *argc, char **argv)
51 {
52 char *str;
53 const char *env;
54
55 if ((env = getenv("DMESA_GLUT_BPP")) != NULL) {
56 g_bpp = atoi(env);
57 }
58 if ((env = getenv("DMESA_GLUT_REFRESH")) != NULL) {
59 g_refresh = atoi(env);
60 }
61
62 /* Determine program name. */
63 str = strrchr(argv[0], '/');
64 if (str == NULL) {
65 str = argv[0];
66 } else {
67 str++;
68 }
69 __glutProgramName = __glutStrdup(str);
70
71 /* Initialize timer */
72 glutGet(GLUT_ELAPSED_TIME);
73 }
74
75
76
77 void APIENTRY glutInitDisplayMode (unsigned int mode)
78 {
79 g_display_mode = mode;
80 }
81
82
83
84 void APIENTRY glutInitWindowPosition (int x, int y)
85 {
86 g_init_x = x;
87 g_init_y = y;
88 }
89
90
91
92 void APIENTRY glutInitWindowSize (int width, int height)
93 {
94 g_init_w = width;
95 g_init_h = height;
96 }
97
98
99
100 void APIENTRY glutMainLoop (void)
101 {
102 GLboolean idle;
103 static int old_mouse_x = 0;
104 static int old_mouse_y = 0;
105 static int old_mouse_b = 0;
106
107 {
108 GLint screen_size[2];
109 DMesaGetIntegerv(DMESA_SCREEN_SIZE, screen_size);
110 g_screen_w = screen_size[0];
111 g_screen_h = screen_size[1];
112 }
113
114 pc_install_keyb();
115 __glutInitMouse();
116
117 glutPostRedisplay();
118 if (g_curwin->reshape) {
119 g_curwin->reshape(g_curwin->width, g_curwin->height);
120 }
121 if (g_curwin->visibility) {
122 g_curwin->visibility(GLUT_VISIBLE);
123 }
124
125 while (GL_TRUE) {
126 idle = GL_TRUE;
127
128 if (g_redisplay && g_curwin->display) {
129 idle = GL_FALSE;
130 g_redisplay = GL_FALSE;
131
132 if (g_curwin->show_mouse && !(g_display_mode & GLUT_DOUBLE)) {
133 /* XXX scare mouse */
134 g_curwin->display();
135 /* XXX unscare mouse */
136 } else {
137 g_curwin->display();
138 }
139 }
140
141 if (g_mouse) {
142 int mouse_x;
143 int mouse_y;
144 int mouse_b;
145
146 /* query mouse */
147 mouse_b = pc_query_mouse(&mouse_x, &mouse_y);
148
149 /* relative to window coordinates */
150 g_mouse_x = mouse_x - g_curwin->xpos;
151 g_mouse_y = mouse_y - g_curwin->ypos;
152
153 /* mouse was moved? */
154 if ((mouse_x != old_mouse_x) || (mouse_y != old_mouse_y)) {
155 idle = GL_FALSE;
156 old_mouse_x = mouse_x;
157 old_mouse_y = mouse_y;
158
159 if (mouse_b) {
160 /* any button pressed */
161 if (g_curwin->motion) {
162 g_curwin->motion(g_mouse_x, g_mouse_y);
163 }
164 } else {
165 /* no button pressed */
166 if (g_curwin->passive) {
167 g_curwin->passive(g_mouse_x, g_mouse_y);
168 }
169 }
170 }
171
172 /* button state changed? */
173 if (mouse_b != old_mouse_b) {
174 GLUTmouseCB mouse_func;
175
176 if ((mouse_func = g_curwin->mouse)) {
177 if ((old_mouse_b & 1) && !(mouse_b & 1))
178 mouse_func(GLUT_LEFT_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y);
179 else if (!(old_mouse_b & 1) && (mouse_b & 1))
180 mouse_func(GLUT_LEFT_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y);
181
182 if ((old_mouse_b & 2) && !(mouse_b & 2))
183 mouse_func(GLUT_RIGHT_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y);
184 else if (!(old_mouse_b & 2) && (mouse_b & 2))
185 mouse_func(GLUT_RIGHT_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y);
186
187 if ((old_mouse_b & 4) && !(mouse_b & 4))
188 mouse_func(GLUT_MIDDLE_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y);
189 else if (!(old_mouse_b & 3) && (mouse_b & 4))
190 mouse_func(GLUT_MIDDLE_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y);
191 }
192
193 idle = GL_FALSE;
194 old_mouse_b = mouse_b;
195 }
196 }
197
198 if (pc_keypressed()) {
199 int key;
200 int glut_key;
201
202 idle = GL_FALSE;
203 key = pc_readkey();
204
205 switch (key>>16) {
206 case KEY_F1: glut_key = GLUT_KEY_F1; goto special;
207 case KEY_F2: glut_key = GLUT_KEY_F2; goto special;
208 case KEY_F3: glut_key = GLUT_KEY_F3; goto special;
209 case KEY_F4: glut_key = GLUT_KEY_F4; goto special;
210 case KEY_F5: glut_key = GLUT_KEY_F5; goto special;
211 case KEY_F6: glut_key = GLUT_KEY_F6; goto special;
212 case KEY_F7: glut_key = GLUT_KEY_F7; goto special;
213 case KEY_F8: glut_key = GLUT_KEY_F8; goto special;
214 case KEY_F9: glut_key = GLUT_KEY_F9; goto special;
215 case KEY_F10: glut_key = GLUT_KEY_F10; goto special;
216 case KEY_F11: glut_key = GLUT_KEY_F11; goto special;
217 case KEY_F12: glut_key = GLUT_KEY_F12; goto special;
218 case KEY_LEFT: glut_key = GLUT_KEY_LEFT; goto special;
219 case KEY_UP: glut_key = GLUT_KEY_UP; goto special;
220 case KEY_RIGHT: glut_key = GLUT_KEY_RIGHT; goto special;
221 case KEY_DOWN: glut_key = GLUT_KEY_DOWN; goto special;
222 case KEY_PGUP: glut_key = GLUT_KEY_PAGE_UP; goto special;
223 case KEY_PGDN: glut_key = GLUT_KEY_PAGE_DOWN; goto special;
224 case KEY_HOME: glut_key = GLUT_KEY_HOME; goto special;
225 case KEY_END: glut_key = GLUT_KEY_END; goto special;
226 case KEY_INSERT: glut_key = GLUT_KEY_INSERT; goto special;
227 special:
228 if (g_curwin->special) {
229 g_curwin->special(glut_key, g_mouse_x, g_mouse_y);
230 }
231 break;
232 default:
233 if (g_curwin->keyboard) {
234 g_curwin->keyboard(key & 0xFF, g_mouse_x, g_mouse_y);
235 }
236 }
237 }
238
239 if (idle && g_idle_func)
240 g_idle_func();
241 }
242 }