*/\r
\r
/*\r
- * DOS/DJGPP glut driver v0.1 for Mesa 4.0\r
+ * DOS/DJGPP glut driver v0.2 for Mesa 4.0\r
*\r
* Copyright (C) 2002 - Borca Daniel\r
* Email : dborca@yahoo.com\r
#include "internal.h"\r
\r
\r
+\r
+static int window;\r
+\r
static DMesaVisual visual = NULL;\r
static DMesaContext context = NULL;\r
-static DMesaBuffer buffer = NULL;\r
+static DMesaBuffer buffer[MAX_WINDOWS];\r
+\r
\r
\r
static void clean (void)\r
{\r
- __asm__("movw $3, %%ax; int $0x10":::"%eax");\r
+ int i;\r
+\r
+ for (i=0; i<MAX_WINDOWS; i++) {\r
+ glutDestroyWindow(i+1);\r
+ }\r
+ if (context) DMesaDestroyContext(context);\r
+ if (visual) DMesaDestroyVisual(visual);\r
+\r
pc_close_stdout();\r
pc_close_stderr();\r
}\r
\r
-int APIENTRY glutCreateWindow (const char *title)\r
-{\r
- if ((visual=DMesaCreateVisual(COLOR_DEPTH,\r
- g_display_mode & GLUT_DOUBLE,\r
- g_display_mode & GLUT_DEPTH ?DEPTH_SIZE :0,\r
- g_display_mode & GLUT_STENCIL?STENCIL_SIZE:0,\r
- g_display_mode & GLUT_ACCUM ?ACCUM_SIZE :0))==NULL) {\r
- return GL_FALSE;\r
- }\r
\r
- if ((context=DMesaCreateContext(visual, NULL))==NULL) {\r
- DMesaDestroyVisual(visual);\r
- return GL_FALSE;\r
- }\r
\r
- if ((buffer=DMesaCreateBuffer(visual, g_width, g_height, g_xpos, g_ypos))==NULL) {\r
- DMesaDestroyContext(context);\r
- DMesaDestroyVisual(visual);\r
- return GL_FALSE;\r
+int APIENTRY glutCreateWindow (const char *title)\r
+{\r
+ int i;\r
+\r
+ if (!visual) {\r
+ int screen_w = DEFAULT_WIDTH;\r
+ int screen_h = DEFAULT_HEIGHT;\r
+\r
+ if ((g_width<=640) && (g_height<=480)) {\r
+ screen_w = 640;\r
+ screen_h = 480;\r
+ } else if ((g_width<=800) && (g_height<=600)) {\r
+ screen_w = 800;\r
+ screen_h = 600;\r
+ } else if ((g_width<=1024) && (g_height<=768)) {\r
+ screen_w = 1024;\r
+ screen_h = 768;\r
+ }\r
+\r
+ if ((visual=DMesaCreateVisual(screen_w, screen_h, DEFAULT_BPP,\r
+ g_display_mode & GLUT_DOUBLE,\r
+ g_display_mode & GLUT_DEPTH ?DEPTH_SIZE :0,\r
+ g_display_mode & GLUT_STENCIL?STENCIL_SIZE:0,\r
+ g_display_mode & GLUT_ACCUM ?ACCUM_SIZE :0))==NULL) {\r
+ return 0;\r
+ }\r
+ \r
+ if ((context=DMesaCreateContext(visual, NULL))==NULL) {\r
+ DMesaDestroyVisual(visual);\r
+ return 0;\r
+ }\r
+ \r
+ pc_open_stdout();\r
+ pc_open_stderr();\r
+ pc_atexit(clean);\r
}\r
\r
- if (!DMesaMakeCurrent(context, buffer)) {\r
- DMesaDestroyContext(context);\r
- DMesaDestroyVisual(visual);\r
- return GL_FALSE;\r
+ for (i=0; i<MAX_WINDOWS; i++) {\r
+ if (!buffer[i]) {\r
+ DMesaBuffer b;\r
+ \r
+ if ((b=DMesaCreateBuffer(visual, g_xpos, g_ypos, g_width, g_height))==NULL) {\r
+ return 0;\r
+ }\r
+ if (!DMesaMakeCurrent(context, b)) {\r
+ DMesaDestroyBuffer(b);\r
+ return 0;\r
+ }\r
+ if (g_mouse) {\r
+ pc_mouse_area(g_xpos, g_ypos, g_xpos + g_width - 1, g_ypos + g_height - 1);\r
+ }\r
+\r
+ buffer[window = i] = b;\r
+ return i+1;\r
+ }\r
}\r
\r
- pc_open_stdout();\r
- pc_open_stderr();\r
- pc_atexit(clean);\r
-\r
- return GL_TRUE;\r
+ return 0;\r
}\r
\r
\r
\r
void APIENTRY glutDestroyWindow (int win)\r
{\r
+ if (buffer[win-1]) {\r
+ DMesaDestroyBuffer(buffer[win-1]);\r
+ buffer[win-1] = NULL;\r
+ }\r
}\r
\r
\r
void APIENTRY glutSwapBuffers (void)\r
{\r
if (g_mouse) pc_scare_mouse();\r
- DMesaSwapBuffers(buffer);\r
+ DMesaSwapBuffers(buffer[window]);\r
if (g_mouse) pc_unscare_mouse();\r
}\r
\r
\r
int APIENTRY glutGetWindow (void)\r
{\r
- return 0;\r
+ return window + 1;\r
}\r
\r
\r
void APIENTRY glutSetWindow (int win)\r
{\r
+ window = win - 1;\r
}\r
\r
\r