DOS updates from Daniel Borca
[mesa.git] / src / glut / dos / window.c
index 6d52524dfbd6a8c50ff377e1626a6d5c2a5af7cb..c110715ebb38944c427ce7fe91cbeb47fae5f57c 100644 (file)
@@ -19,7 +19,7 @@
  */\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
@@ -87,6 +126,10 @@ int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
 \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
@@ -99,19 +142,20 @@ void APIENTRY glutPostRedisplay (void)
 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