From 398c6b7980ac52ba15af78f45e71f49f33ded1aa Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 4 Feb 2003 02:43:27 +0000 Subject: DOS updates (Daniel Borca) --- src/glut/dos/Makefile.DJ | 23 +++-- src/glut/dos/PC_HW/pc_hw.c | 15 ++- src/glut/dos/PC_HW/pc_hw.h | 7 +- src/glut/dos/PC_HW/pc_keyb.c | 7 +- src/glut/dos/PC_HW/pc_mouse.c | 17 +--- src/glut/dos/PC_HW/pc_timer.c | 4 +- src/glut/dos/callback.c | 92 +++++++++-------- src/glut/dos/color.c | 7 +- src/glut/dos/extens.c | 63 ++++++++++++ src/glut/dos/glutint.h | 147 ++++++++++++++++++++++++++++ src/glut/dos/init.c | 223 ++++++++++++++++++++++++++++-------------- src/glut/dos/menu.c | 36 ++++++- src/glut/dos/mouse.c | 58 +++++++++++ src/glut/dos/overlay.c | 35 ++++++- src/glut/dos/state.c | 84 ++++++++++++++-- src/glut/dos/window.c | 107 +++++++++++++------- 16 files changed, 722 insertions(+), 203 deletions(-) create mode 100644 src/glut/dos/extens.c create mode 100644 src/glut/dos/glutint.h create mode 100644 src/glut/dos/mouse.c (limited to 'src/glut') diff --git a/src/glut/dos/Makefile.DJ b/src/glut/dos/Makefile.DJ index fed1f42e8c..2fb1bee27d 100644 --- a/src/glut/dos/Makefile.DJ +++ b/src/glut/dos/Makefile.DJ @@ -54,10 +54,10 @@ GLUT_DXE = glut.dxe GLUT_IMP = libiglut.a CC = gcc -CFLAGS += -I$(TOP)/include -I$(MKGLUT) +CFLAGS += -I- -I$(TOP)/include -I. -I$(MKGLUT) -IPC_HW AR = ar -ARFLAGS = ru +ARFLAGS = rus ifneq ($(wildcard $(DJDIR)/lib/dxe3.ld),) DXE3GEN = $(wildcard $(addsuffix /dxe3gen.exe,$(subst ;, ,$(PATH)))) @@ -66,16 +66,14 @@ endif RM = del CORE_SOURCES = \ - bitmap.c \ callback.c \ color.c \ - globals.c \ + extens.c \ init.c \ menu.c \ - models.c \ + mouse.c \ overlay.c \ state.c \ - teapot.c \ window.c PC_HW_SOURCES = \ @@ -86,13 +84,22 @@ PC_HW_SOURCES = \ PC_HW/pc_irq.S MKGLUT_SOURCES = \ + $(MKGLUT)/glut_bitmap.c \ + $(MKGLUT)/glut_bwidth.c \ + $(MKGLUT)/glut_stroke.c \ + $(MKGLUT)/glut_swidth.c \ + $(MKGLUT)/glut_shapes.c \ + $(MKGLUT)/glut_teapot.c \ $(MKGLUT)/glut_8x13.c \ $(MKGLUT)/glut_9x15.c \ $(MKGLUT)/glut_hel10.c \ $(MKGLUT)/glut_hel12.c \ $(MKGLUT)/glut_hel18.c \ $(MKGLUT)/glut_tr10.c \ - $(MKGLUT)/glut_tr24.c + $(MKGLUT)/glut_tr24.c \ + $(MKGLUT)/glut_roman.c \ + $(MKGLUT)/glut_mroman.c \ + $(MKGLUT)/glut_util.c SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES) $(MKGLUT_SOURCES) @@ -115,7 +122,7 @@ ifeq ($(DXE3GEN),) $(warning Missing DXE3GEN and/or DXE3.LD! You must have DXE3GEN) $(warning somewhere in PATH, and DXE3.LD in DJGPP/LIB directory.) else - -dxe3gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) -D "MesaGLUT DJGPP" -E glut -X -P gl.dxe -P glu.dxe -U $(OBJECTS) + -dxe3gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) -D "MesaGLUT DJGPP" -E _glut -P gl.dxe -P glu.dxe -U $(OBJECTS) endif clean: diff --git a/src/glut/dos/PC_HW/pc_hw.c b/src/glut/dos/PC_HW/pc_hw.c index 867daf89b0..f08286d4c4 100644 --- a/src/glut/dos/PC_HW/pc_hw.c +++ b/src/glut/dos/PC_HW/pc_hw.c @@ -73,9 +73,6 @@ void *pc_malloc (size_t size) /* * standard redirection */ -#define STDOUT 1 -#define STDERR 2 - static char outname[L_tmpnam]; static int h_out, h_outbak; static char errname[L_tmpnam]; @@ -86,9 +83,9 @@ int pc_open_stdout (void) tmpnam(outname); if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) { - h_outbak = dup(STDOUT); + h_outbak = dup(STDOUT_FILENO); fflush(stdout); - dup2(h_out, STDOUT); + dup2(h_out, STDOUT_FILENO); } return h_out; @@ -100,7 +97,7 @@ void pc_close_stdout (void) char *line = alloca(512); if (h_out > 0) { - dup2(h_outbak, STDOUT); + dup2(h_outbak, STDOUT_FILENO); close(h_out); close(h_outbak); @@ -119,9 +116,9 @@ int pc_open_stderr (void) tmpnam(errname); if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) { - h_errbak = dup(STDERR); + h_errbak = dup(STDERR_FILENO); fflush(stderr); - dup2(h_err, STDERR); + dup2(h_err, STDERR_FILENO); } return h_err; @@ -133,7 +130,7 @@ void pc_close_stderr (void) char *line = alloca(512); if (h_err > 0) { - dup2(h_errbak, STDERR); + dup2(h_errbak, STDERR_FILENO); close(h_err); close(h_errbak); diff --git a/src/glut/dos/PC_HW/pc_hw.h b/src/glut/dos/PC_HW/pc_hw.h index 77572e6441..c38c8959b6 100644 --- a/src/glut/dos/PC_HW/pc_hw.h +++ b/src/glut/dos/PC_HW/pc_hw.h @@ -1,5 +1,5 @@ /* - * PC/HW routine collection v1.2 for DOS/DJGPP + * PC/HW routine collection v1.3 for DOS/DJGPP * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -39,6 +39,7 @@ int pc_clexit (VFUNC f); #define ENDOFUNC(x) static void x##_end() { } #define LOCKFUNC(x) _go32_dpmi_lock_code((void *)x, (long)x##_end - (long)x) #define LOCKDATA(x) _go32_dpmi_lock_data((void *)&x, sizeof(x)) +#define LOCKBUFF(x, l) _go32_dpmi_lock_data((void *)x, l) void *pc_malloc (size_t size); @@ -194,6 +195,7 @@ void pc_remove_keyb (void); int pc_keypressed (void); int pc_readkey (void); int pc_keydown (int code); +int pc_keyshifts (void); /* * timer @@ -210,9 +212,6 @@ MFUNC pc_install_mouse_handler (MFUNC handler); void pc_mouse_area (int x1, int y1, int x2, int y2); void pc_mouse_speed (int xspeed, int yspeed); int pc_query_mouse (int *x, int *y); -void pc_show_mouse (void); -void pc_scare_mouse (void); -void pc_unscare_mouse (void); /* * standard redirection diff --git a/src/glut/dos/PC_HW/pc_keyb.c b/src/glut/dos/PC_HW/pc_keyb.c index fb22923d63..333ca757f5 100644 --- a/src/glut/dos/PC_HW/pc_keyb.c +++ b/src/glut/dos/PC_HW/pc_keyb.c @@ -1,5 +1,5 @@ /* - * PC/HW routine collection v1.1 for DOS/DJGPP + * PC/HW routine collection v1.3 for DOS/DJGPP * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -445,6 +445,11 @@ int pc_keydown (int code) return pc_key[code]; } +int pc_keyshifts (void) +{ + return key_shifts; +} + void pc_remove_keyb (void) { if (keyboard_installed) { diff --git a/src/glut/dos/PC_HW/pc_mouse.c b/src/glut/dos/PC_HW/pc_mouse.c index 01e9502dd0..3ed7650906 100644 --- a/src/glut/dos/PC_HW/pc_mouse.c +++ b/src/glut/dos/PC_HW/pc_mouse.c @@ -1,5 +1,5 @@ /* - * PC/HW routine collection v1.2 for DOS/DJGPP + * PC/HW routine collection v1.3 for DOS/DJGPP * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -212,22 +212,9 @@ int pc_query_mouse (int *x, int *y) return pc_mouse_b; } -void pc_show_mouse (void) -{ - /* not implemented */ -} -void pc_scare_mouse (void) -{ - /* not implemented */ -} -void pc_unscare_mouse (void) -{ - /* not implemented */ -} - __asm("\n\ .text \n\ - .balign 4 \n\ + .p2align 5,,31 \n\ .global _mouse_wrapper \n\ _mouse_wrapper: \n\ cld \n\ diff --git a/src/glut/dos/PC_HW/pc_timer.c b/src/glut/dos/PC_HW/pc_timer.c index ec348e278b..36c02910a3 100644 --- a/src/glut/dos/PC_HW/pc_timer.c +++ b/src/glut/dos/PC_HW/pc_timer.c @@ -1,5 +1,5 @@ /* - * PC/HW routine collection v1.0 for DOS/DJGPP + * PC/HW routine collection v1.3 for DOS/DJGPP * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -27,7 +27,7 @@ typedef struct { volatile void *parm; } TIMER; -TIMER timer_main, timer_func[MAX_TIMERS]; +static TIMER timer_main, timer_func[MAX_TIMERS]; static int timer () { diff --git a/src/glut/dos/callback.c b/src/glut/dos/callback.c index a9260cbe7c..6e3f5a77c7 100644 --- a/src/glut/dos/callback.c +++ b/src/glut/dos/callback.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.0 for Mesa 4.0 + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -27,126 +27,138 @@ */ -#include "GL/glut.h" -#include "internal.h" +#include "glutint.h" -void APIENTRY glutDisplayFunc (void (GLUTCALLBACK *func) (void)) -{ - display_func = func; -} +GLUTidleCB g_idle_func = NULL; -void APIENTRY glutReshapeFunc (void (GLUTCALLBACK *func) (int width, int height)) -{ - reshape_func = func; -} -void APIENTRY glutKeyboardFunc (void (GLUTCALLBACK *func) (unsigned char key, int x, int y)) +void APIENTRY glutDisplayFunc (GLUTdisplayCB func) { - keyboard_func = func; + g_curwin->display = func; } -void APIENTRY glutMouseFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y)) + +void APIENTRY glutReshapeFunc (GLUTreshapeCB func) { - mouse_func = func; + g_curwin->reshape = func; } -void APIENTRY glutMotionFunc (void (GLUTCALLBACK *func) (int x, int y)) + +void APIENTRY glutKeyboardFunc (GLUTkeyboardCB func) { - motion_func = func; + g_curwin->keyboard = func; } -void APIENTRY glutPassiveMotionFunc (void (GLUTCALLBACK *func) (int x, int y)) + +void APIENTRY glutMouseFunc (GLUTmouseCB func) { - passive_motion_func = func; + g_curwin->mouse = func; } -void APIENTRY glutEntryFunc (void (GLUTCALLBACK *func) (int state)) + +void APIENTRY glutMotionFunc (GLUTmotionCB func) { - entry_func = func; + g_curwin->motion = func; } -void APIENTRY glutVisibilityFunc (void (GLUTCALLBACK *func) (int state)) + +void APIENTRY glutPassiveMotionFunc (GLUTpassiveCB func) { - visibility_func = func; + g_curwin->passive = func; } -void APIENTRY glutIdleFunc (void (GLUTCALLBACK *func) (void)) + +void APIENTRY glutEntryFunc (GLUTentryCB func) { - idle_func = func; + g_curwin->entry = func; } -void APIENTRY glutTimerFunc (unsigned int millis, void (GLUTCALLBACK *func) (int value), int value) + +void APIENTRY glutVisibilityFunc (GLUTvisibilityCB func) { + g_curwin->visibility = func; } -void APIENTRY glutMenuStateFunc (void (GLUTCALLBACK *func) (int state)) + +void APIENTRY glutWindowStatusFunc (GLUTwindowStatusCB func) { - menu_state_func = func; } -void APIENTRY glutSpecialFunc (void (GLUTCALLBACK *func) (int key, int x, int y)) + +void APIENTRY glutIdleFunc (GLUTidleCB func) { - special_func = func; + g_idle_func = func; } -void APIENTRY glutSpaceballMotionFunc (void (GLUTCALLBACK *func) (int x, int y, int z)) + +void APIENTRY glutTimerFunc (unsigned int millis, GLUTtimerCB func, int value) { } -void APIENTRY glutSpaceballRotateFunc (void (GLUTCALLBACK *func) (int x, int y, int z)) + +void APIENTRY glutSpecialFunc (GLUTspecialCB func) { + g_curwin->special = func; } -void APIENTRY glutSpaceballButtonFunc (void (GLUTCALLBACK *func) (int button, int state)) + +void APIENTRY glutSpaceballMotionFunc (GLUTspaceMotionCB func) { } -void APIENTRY glutButtonBoxFunc (void (GLUTCALLBACK *func) (int button, int state)) + +void APIENTRY glutSpaceballRotateFunc (GLUTspaceRotateCB func) { } -void APIENTRY glutDialsFunc (void (GLUTCALLBACK *func) (int dial, int value)) + +void APIENTRY glutSpaceballButtonFunc (GLUTspaceButtonCB func) { } -void APIENTRY glutTabletMotionFunc (void (GLUTCALLBACK *func) (int x, int y)) + +void APIENTRY glutDialsFunc (GLUTdialsCB func) { } -void APIENTRY glutTabletButtonFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y)) + +void APIENTRY glutButtonBoxFunc (GLUTbuttonBoxCB func) { } -void APIENTRY glutMenuStatusFunc (void (GLUTCALLBACK *func) (int status, int x, int y)) + +void APIENTRY glutTabletMotionFunc (GLUTtabletMotionCB func) { } -void APIENTRY glutOverlayDisplayFunc (void (GLUTCALLBACK *func) (void)) + +void APIENTRY glutTabletButtonFunc (GLUTtabletButtonCB func) { } -void APIENTRY glutWindowStatusFunc (void (GLUTCALLBACK *func) (int state)) + +void APIENTRY glutJoystickFunc (GLUTjoystickCB func, int interval) { } diff --git a/src/glut/dos/color.c b/src/glut/dos/color.c index f1f529521d..2e8ed3f95b 100644 --- a/src/glut/dos/color.c +++ b/src/glut/dos/color.c @@ -27,9 +27,8 @@ */ -#include "GL/glut.h" +#include "glutint.h" #include "GL/dmesa.h" -#include "internal.h" @@ -40,7 +39,9 @@ void APIENTRY glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue) { if (g_display_mode & GLUT_INDEX) { - DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue)); + if ((ndx >= 0) && (ndx < (256 - RESERVED_COLORS))) { + DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue)); + } } } diff --git a/src/glut/dos/extens.c b/src/glut/dos/extens.c new file mode 100644 index 0000000000..ae8e44f408 --- /dev/null +++ b/src/glut/dos/extens.c @@ -0,0 +1,63 @@ +/* + * Mesa 3-D graphics library + * Version: 3.4 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include + +#include "GL/glut.h" + + + +int APIENTRY glutExtensionSupported (const char *extension) +{ + static const GLubyte *extensions = NULL; + const GLubyte *last, *where; + + /* Extension names should not have spaces. */ + if (strchr(extension, ' ') || *extension == '\0') { + return GL_FALSE; + } + + /* Not my problem if you don't have a valid OpenGL context */ + if (!extensions) { + extensions = glGetString(GL_EXTENSIONS); + } + + /* Take care of sub-strings etc. */ + for (last = extensions;;) { + if ((where = (GLubyte *)strstr((const char *)last, extension)) == NULL) { + return GL_FALSE; + } + last = where + strlen(extension); + if (where == extensions || *(where - 1) == ' ') { + if (*last == ' ' || *last == '\0') { + return GL_TRUE; + } + } + } +} diff --git a/src/glut/dos/glutint.h b/src/glut/dos/glutint.h new file mode 100644 index 0000000000..77a8322c44 --- /dev/null +++ b/src/glut/dos/glutint.h @@ -0,0 +1,147 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef __glutint_h__ +#define __glutint_h__ + +#include + +#include "GL/dmesa.h" + + + +/* GLUT function types */ +typedef void (GLUTCALLBACK *GLUTdisplayCB) (void); +typedef void (GLUTCALLBACK *GLUTreshapeCB) (int, int); +typedef void (GLUTCALLBACK *GLUTkeyboardCB) (unsigned char, int, int); +typedef void (GLUTCALLBACK *GLUTmouseCB) (int, int, int, int); +typedef void (GLUTCALLBACK *GLUTmotionCB) (int, int); +typedef void (GLUTCALLBACK *GLUTpassiveCB) (int, int); +typedef void (GLUTCALLBACK *GLUTentryCB) (int); +typedef void (GLUTCALLBACK *GLUTvisibilityCB) (int); +typedef void (GLUTCALLBACK *GLUTwindowStatusCB) (int); +typedef void (GLUTCALLBACK *GLUTidleCB) (void); +typedef void (GLUTCALLBACK *GLUTtimerCB) (int); +typedef void (GLUTCALLBACK *GLUTmenuStateCB) (int); /* DEPRECATED. */ +typedef void (GLUTCALLBACK *GLUTmenuStatusCB) (int, int, int); +typedef void (GLUTCALLBACK *GLUTselectCB) (int); +typedef void (GLUTCALLBACK *GLUTspecialCB) (int, int, int); +typedef void (GLUTCALLBACK *GLUTspaceMotionCB) (int, int, int); +typedef void (GLUTCALLBACK *GLUTspaceRotateCB) (int, int, int); +typedef void (GLUTCALLBACK *GLUTspaceButtonCB) (int, int); +typedef void (GLUTCALLBACK *GLUTdialsCB) (int, int); +typedef void (GLUTCALLBACK *GLUTbuttonBoxCB) (int, int); +typedef void (GLUTCALLBACK *GLUTtabletMotionCB) (int, int); +typedef void (GLUTCALLBACK *GLUTtabletButtonCB) (int, int, int, int); +typedef void (GLUTCALLBACK *GLUTjoystickCB) (unsigned int, int, int, int); + +typedef struct GLUTwindow { + int num; /* window id */ + + DMesaBuffer buffer; + + int show_mouse; + + /* GLUT settable or visible window state. */ + int xpos; + int ypos; + int width; /* window width in pixels */ + int height; /* window height in pixels */ + + /* Per-window callbacks. */ + GLUTdisplayCB display; /* redraw */ + GLUTreshapeCB reshape; /* resize (width,height) */ + GLUTmouseCB mouse; /* mouse (button,state,x,y) */ + GLUTmotionCB motion; /* motion (x,y) */ + GLUTpassiveCB passive; /* passive motion (x,y) */ + GLUTentryCB entry; /* window entry/exit (state) */ + GLUTkeyboardCB keyboard; /* keyboard (ASCII,x,y) */ + GLUTkeyboardCB keyboardUp; /* keyboard up (ASCII,x,y) */ + GLUTwindowStatusCB windowStatus; /* window status */ + GLUTvisibilityCB visibility; /* visibility */ + GLUTspecialCB special; /* special key */ + GLUTspecialCB specialUp; /* special up key */ + GLUTbuttonBoxCB buttonBox; /* button box */ + GLUTdialsCB dials; /* dials */ + GLUTspaceMotionCB spaceMotion; /* Spaceball motion */ + GLUTspaceRotateCB spaceRotate; /* Spaceball rotate */ + GLUTspaceButtonCB spaceButton; /* Spaceball button */ + GLUTtabletMotionCB tabletMotion; /* tablet motion */ + GLUTtabletButtonCB tabletButton; /* tablet button */ + GLUTjoystickCB joystick; /* joystick */ +} GLUTwindow; + +extern GLUTidleCB g_idle_func; +extern GLUTmenuStatusCB g_menu_status_func; + +extern GLboolean g_redisplay; + +extern GLuint g_bpp; /* HW: bits per pixel */ +extern GLuint g_refresh; /* HW: vertical refresh rate */ +extern GLuint g_screen_w, g_screen_h; /* HW: physical screen size */ + +extern GLuint g_display_mode; /* display bits */ +extern int g_init_x, g_init_y; /* initial window position */ +extern GLuint g_init_w, g_init_h; /* initial window size */ + +extern int g_mouse; /* non-zero if mouse installed */ +extern int g_mouse_x, g_mouse_y; /* mouse coords, relative to current win */ + +extern GLUTwindow *g_curwin; /* current window */ + +extern char *__glutProgramName; /* program name */ + +extern void __glutInitMouse (void); + +/* private routines from glut_util.c */ +extern char * __glutStrdup(const char *string); +extern void __glutWarning(char *format,...); +extern void __glutFatalError(char *format,...); +extern void __glutFatalUsage(char *format,...); + + + +/* hmmm... */ +#include "pc_hw/pc_hw.h" + + + +#define MAX_WINDOWS 2 + +#define DEFAULT_WIDTH 300 +#define DEFAULT_HEIGHT 300 +#define DEFAULT_BPP 16 + +#define DEPTH_SIZE 16 +#define STENCIL_SIZE 8 +#define ACCUM_SIZE 16 + +#define RESERVED_COLORS 0 + +#endif /* __glutint_h__ */ diff --git a/src/glut/dos/init.c b/src/glut/dos/init.c index 4ee939b487..0f848f6f36 100644 --- a/src/glut/dos/init.c +++ b/src/glut/dos/init.c @@ -27,12 +27,29 @@ */ -#include "GL/glut.h" -#include "internal.h" +#include +#include "glutint.h" -void APIENTRY glutInit (int *argcp, char **argv) + + +GLboolean g_redisplay = GL_FALSE; + +GLuint g_bpp = DEFAULT_BPP; +GLuint g_refresh = 0; +GLuint g_screen_w, g_screen_h; + +GLuint g_display_mode = 0; +int g_init_x = 0, g_init_y = 0; +GLuint g_init_w = DEFAULT_WIDTH, g_init_h = DEFAULT_HEIGHT; + +char *__glutProgramName = NULL; + + + +void APIENTRY glutInit (int *argc, char **argv) { + char *str; const char *env; if ((env = getenv("DMESA_GLUT_BPP")) != NULL) { @@ -42,33 +59,44 @@ void APIENTRY glutInit (int *argcp, char **argv) g_refresh = atoi(env); } + /* Determine program name. */ + str = strrchr(argv[0], '/'); + if (str == NULL) { + str = argv[0]; + } else { + str++; + } + __glutProgramName = __glutStrdup(str); + + /* Initialize timer */ glutGet(GLUT_ELAPSED_TIME); } + void APIENTRY glutInitDisplayMode (unsigned int mode) { g_display_mode = mode; - - pc_install_keyb(); - g_mouse = pc_install_mouse(); } + void APIENTRY glutInitWindowPosition (int x, int y) { - g_xpos = x; - g_ypos = y; + g_init_x = x; + g_init_y = y; } + void APIENTRY glutInitWindowSize (int width, int height) { - g_width = width; - g_height = height; + g_init_w = width; + g_init_h = height; } + void APIENTRY glutMainLoop (void) { GLboolean idle; @@ -76,52 +104,37 @@ void APIENTRY glutMainLoop (void) static int old_mouse_y = 0; static int old_mouse_b = 0; + { + GLint screen_size[2]; + DMesaGetIntegerv(DMESA_SCREEN_SIZE, screen_size); + g_screen_w = screen_size[0]; + g_screen_h = screen_size[1]; + } + + pc_install_keyb(); + __glutInitMouse(); + glutPostRedisplay(); - if (reshape_func) reshape_func(g_width, g_height); - if (visibility_func) visibility_func(GLUT_VISIBLE); - if (g_mouse) pc_show_mouse(); + if (g_curwin->reshape) { + g_curwin->reshape(g_curwin->width, g_curwin->height); + } + if (g_curwin->visibility) { + g_curwin->visibility(GLUT_VISIBLE); + } while (GL_TRUE) { idle = GL_TRUE; - if (g_redisplay && display_func) { + if (g_redisplay && g_curwin->display) { idle = GL_FALSE; g_redisplay = GL_FALSE; - if (g_mouse && !(g_display_mode & GLUT_DOUBLE)) pc_scare_mouse(); - display_func(); - if (g_mouse && !(g_display_mode & GLUT_DOUBLE)) pc_unscare_mouse(); - } - - if (pc_keypressed()) { - int key; - - idle = GL_FALSE; - key = pc_readkey(); - - switch (key>>16) { - case KEY_F1: if (special_func) special_func(GLUT_KEY_F1, 0, 0); break; - case KEY_F2: if (special_func) special_func(GLUT_KEY_F2, 0, 0); break; - case KEY_F3: if (special_func) special_func(GLUT_KEY_F3, 0, 0); break; - case KEY_F4: if (special_func) special_func(GLUT_KEY_F4, 0, 0); break; - case KEY_F5: if (special_func) special_func(GLUT_KEY_F5, 0, 0); break; - case KEY_F6: if (special_func) special_func(GLUT_KEY_F6, 0, 0); break; - case KEY_F7: if (special_func) special_func(GLUT_KEY_F7, 0, 0); break; - case KEY_F8: if (special_func) special_func(GLUT_KEY_F8, 0, 0); break; - case KEY_F9: if (special_func) special_func(GLUT_KEY_F9, 0, 0); break; - case KEY_F10: if (special_func) special_func(GLUT_KEY_F10, 0, 0); break; - case KEY_F11: if (special_func) special_func(GLUT_KEY_F11, 0, 0); break; - case KEY_F12: if (special_func) special_func(GLUT_KEY_F12, 0, 0); break; - case KEY_LEFT: if (special_func) special_func(GLUT_KEY_LEFT, 0, 0); break; - case KEY_UP: if (special_func) special_func(GLUT_KEY_UP, 0, 0); break; - case KEY_RIGHT: if (special_func) special_func(GLUT_KEY_RIGHT, 0, 0); break; - case KEY_DOWN: if (special_func) special_func(GLUT_KEY_DOWN, 0, 0); break; - case KEY_PGUP: if (special_func) special_func(GLUT_KEY_PAGE_UP, 0, 0); break; - case KEY_PGDN: if (special_func) special_func(GLUT_KEY_PAGE_DOWN, 0, 0); break; - case KEY_HOME: if (special_func) special_func(GLUT_KEY_HOME, 0, 0); break; - case KEY_END: if (special_func) special_func(GLUT_KEY_END, 0, 0); break; - case KEY_INSERT: if (special_func) special_func(GLUT_KEY_INSERT, 0, 0); break; - default: if (keyboard_func) keyboard_func(key & 0xFF, 0, 0); + if (g_curwin->show_mouse && !(g_display_mode & GLUT_DOUBLE)) { + /* XXX scare mouse */ + g_curwin->display(); + /* XXX unscare mouse */ + } else { + g_curwin->display(); } } @@ -129,41 +142,101 @@ void APIENTRY glutMainLoop (void) int mouse_x; int mouse_y; int mouse_b; - + + /* query mouse */ mouse_b = pc_query_mouse(&mouse_x, &mouse_y); - - if (motion_func && ((mouse_x != old_mouse_x) || (mouse_y != old_mouse_y))) { + + /* relative to window coordinates */ + g_mouse_x = mouse_x - g_curwin->xpos; + g_mouse_y = mouse_y - g_curwin->ypos; + + /* mouse was moved? */ + if ((mouse_x != old_mouse_x) || (mouse_y != old_mouse_y)) { idle = GL_FALSE; old_mouse_x = mouse_x; old_mouse_y = mouse_y; - - motion_func(old_mouse_x, old_mouse_y); + + if (mouse_b) { + /* any button pressed */ + if (g_curwin->motion) { + g_curwin->motion(g_mouse_x, g_mouse_y); + } + } else { + /* no button pressed */ + if (g_curwin->passive) { + g_curwin->passive(g_mouse_x, g_mouse_y); + } + } } - - if (mouse_func && (mouse_b != old_mouse_b)) { - int new_mouse_b = mouse_b; - - if ((old_mouse_b & 1) && !(new_mouse_b & 1)) - mouse_func(GLUT_LEFT_BUTTON, GLUT_UP, mouse_x, mouse_y); - else if (!(old_mouse_b & 1) && (new_mouse_b & 1)) - mouse_func(GLUT_LEFT_BUTTON, GLUT_DOWN, mouse_x, mouse_y); - - if ((old_mouse_b & 2) && !(new_mouse_b & 2)) - mouse_func(GLUT_RIGHT_BUTTON, GLUT_UP, mouse_x, mouse_y); - else if (!(old_mouse_b & 2) && (new_mouse_b & 2)) - mouse_func(GLUT_RIGHT_BUTTON, GLUT_DOWN, mouse_x, mouse_y); - - if ((old_mouse_b & 4) && !(new_mouse_b & 4)) - mouse_func(GLUT_MIDDLE_BUTTON, GLUT_UP, mouse_x, mouse_y); - else if (!(old_mouse_b & 3) && (new_mouse_b & 4)) - mouse_func(GLUT_MIDDLE_BUTTON, GLUT_DOWN, mouse_x, mouse_y); - + + /* button state changed? */ + if (mouse_b != old_mouse_b) { + GLUTmouseCB mouse_func; + + if ((mouse_func = g_curwin->mouse)) { + if ((old_mouse_b & 1) && !(mouse_b & 1)) + mouse_func(GLUT_LEFT_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y); + else if (!(old_mouse_b & 1) && (mouse_b & 1)) + mouse_func(GLUT_LEFT_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y); + + if ((old_mouse_b & 2) && !(mouse_b & 2)) + mouse_func(GLUT_RIGHT_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y); + else if (!(old_mouse_b & 2) && (mouse_b & 2)) + mouse_func(GLUT_RIGHT_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y); + + if ((old_mouse_b & 4) && !(mouse_b & 4)) + mouse_func(GLUT_MIDDLE_BUTTON, GLUT_UP, g_mouse_x, g_mouse_y); + else if (!(old_mouse_b & 3) && (mouse_b & 4)) + mouse_func(GLUT_MIDDLE_BUTTON, GLUT_DOWN, g_mouse_x, g_mouse_y); + } + idle = GL_FALSE; - old_mouse_b = new_mouse_b; + old_mouse_b = mouse_b; + } + } + + if (pc_keypressed()) { + int key; + int glut_key; + + idle = GL_FALSE; + key = pc_readkey(); + + switch (key>>16) { + case KEY_F1: glut_key = GLUT_KEY_F1; goto special; + case KEY_F2: glut_key = GLUT_KEY_F2; goto special; + case KEY_F3: glut_key = GLUT_KEY_F3; goto special; + case KEY_F4: glut_key = GLUT_KEY_F4; goto special; + case KEY_F5: glut_key = GLUT_KEY_F5; goto special; + case KEY_F6: glut_key = GLUT_KEY_F6; goto special; + case KEY_F7: glut_key = GLUT_KEY_F7; goto special; + case KEY_F8: glut_key = GLUT_KEY_F8; goto special; + case KEY_F9: glut_key = GLUT_KEY_F9; goto special; + case KEY_F10: glut_key = GLUT_KEY_F10; goto special; + case KEY_F11: glut_key = GLUT_KEY_F11; goto special; + case KEY_F12: glut_key = GLUT_KEY_F12; goto special; + case KEY_LEFT: glut_key = GLUT_KEY_LEFT; goto special; + case KEY_UP: glut_key = GLUT_KEY_UP; goto special; + case KEY_RIGHT: glut_key = GLUT_KEY_RIGHT; goto special; + case KEY_DOWN: glut_key = GLUT_KEY_DOWN; goto special; + case KEY_PGUP: glut_key = GLUT_KEY_PAGE_UP; goto special; + case KEY_PGDN: glut_key = GLUT_KEY_PAGE_DOWN; goto special; + case KEY_HOME: glut_key = GLUT_KEY_HOME; goto special; + case KEY_END: glut_key = GLUT_KEY_END; goto special; + case KEY_INSERT: glut_key = GLUT_KEY_INSERT; goto special; + special: + if (g_curwin->special) { + g_curwin->special(glut_key, g_mouse_x, g_mouse_y); + } + break; + default: + if (g_curwin->keyboard) { + g_curwin->keyboard(key & 0xFF, g_mouse_x, g_mouse_y); + } } } - if (idle && idle_func) - idle_func(); + if (idle && g_idle_func) + g_idle_func(); } } diff --git a/src/glut/dos/menu.c b/src/glut/dos/menu.c index eccc51d2ea..9a3841b12b 100644 --- a/src/glut/dos/menu.c +++ b/src/glut/dos/menu.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.0 for Mesa 4.0 + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -27,60 +27,90 @@ */ -#include "GL/glut.h" +#include "glutint.h" -int APIENTRY glutCreateMenu (void (GLUTCALLBACK *func) (int)) + +GLUTmenuStatusCB g_menu_status_func = NULL; + + + +void APIENTRY glutMenuStateFunc (GLUTmenuStateCB func) +{ + g_menu_status_func = (GLUTmenuStatusCB)func; +} + + + +void APIENTRY glutMenuStatusFunc (GLUTmenuStatusCB func) +{ + g_menu_status_func = func; +} + + + +int APIENTRY glutCreateMenu (GLUTselectCB func) { return 0; } + + void APIENTRY glutDestroyMenu (int menu) { } + int APIENTRY glutGetMenu (void) { return 0; } + void APIENTRY glutSetMenu (int menu) { } + void APIENTRY glutAddMenuEntry (const char *label, int value) { } + void APIENTRY glutAddSubMenu (const char *label, int submenu) { } + void APIENTRY glutChangeToMenuEntry (int item, const char *label, int value) { } + void APIENTRY glutChangeToSubMenu (int item, const char *label, int submenu) { } + void APIENTRY glutRemoveMenuItem (int item) { } + void APIENTRY glutAttachMenu (int button) { } + void APIENTRY glutDetachMenu (int button) { } diff --git a/src/glut/dos/mouse.c b/src/glut/dos/mouse.c new file mode 100644 index 0000000000..c67f8093b1 --- /dev/null +++ b/src/glut/dos/mouse.c @@ -0,0 +1,58 @@ +/* + * Mesa 3-D graphics library + * Version: 3.4 + * Copyright (C) 1995-1998 Brian Paul + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 + * + * Copyright (C) 2002 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include "glutint.h" + + + +int g_mouse; +int g_mouse_x = 0, g_mouse_y = 0; + + + +void __glutInitMouse (void) +{ + if ((g_mouse = pc_install_mouse())) { + GLint yorg; + GLint rect[4]; + + DMesaGetIntegerv(DMESA_Y_ORIGIN, &yorg); + if (yorg) { + rect[1] = g_screen_h - g_curwin->height; + } else { + rect[1] = g_curwin->ypos; + } + rect[0] = g_curwin->xpos; + rect[2] = rect[0] + g_curwin->width - 1; + rect[3] = rect[1] + g_curwin->height - 1; + pc_mouse_area(rect[0], rect[1], rect[2], rect[3]); + + g_curwin->show_mouse = (g_curwin->mouse || g_curwin->motion || g_curwin->passive); + } +} diff --git a/src/glut/dos/overlay.c b/src/glut/dos/overlay.c index ab4f561849..f1f72cf1f8 100644 --- a/src/glut/dos/overlay.c +++ b/src/glut/dos/overlay.c @@ -19,7 +19,7 @@ */ /* - * DOS/DJGPP glut driver v1.0 for Mesa 4.0 + * DOS/DJGPP glut driver v1.3 for Mesa 5.0 * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com @@ -27,7 +27,33 @@ */ -#include "GL/glut.h" +#include "glutint.h" + + + +int APIENTRY glutLayerGet (GLenum info) +{ + switch (info) { + case GLUT_OVERLAY_POSSIBLE: + case GLUT_HAS_OVERLAY: + return GL_FALSE; + case GLUT_LAYER_IN_USE: + return GLUT_NORMAL; + case GLUT_NORMAL_DAMAGED: + return GL_FALSE; + case GLUT_OVERLAY_DAMAGED: + case GLUT_TRANSPARENT_INDEX: + default: + return -1; + } +} + + + +void APIENTRY glutOverlayDisplayFunc (GLUTdisplayCB func) +{ +} + void APIENTRY glutEstablishOverlay (void) @@ -35,26 +61,31 @@ void APIENTRY glutEstablishOverlay (void) } + void APIENTRY glutRemoveOverlay (void) { } + void APIENTRY glutUseLayer (GLenum layer) { } + void APIENTRY glutPostOverlayRedisplay (void) { } + void APIENTRY glutShowOverlay (void) { } + void APIENTRY glutHideOverlay (void) { } diff --git a/src/glut/dos/state.c b/src/glut/dos/state.c index b26307d9cb..e9735a06a2 100644 --- a/src/glut/dos/state.c +++ b/src/glut/dos/state.c @@ -27,16 +27,19 @@ */ -#include "GL/glut.h" -#include "internal.h" +#include "glutint.h" + #define FREQUENCY 100 + static int timer_installed; static volatile int ticks; + + static void ticks_timer (void *p) { (void)p; @@ -48,25 +51,92 @@ static void ticks_timer (void *p) int APIENTRY glutGet (GLenum type) { switch (type) { - case GLUT_WINDOW_COLORMAP_SIZE: - return (g_display_mode & GLUT_INDEX) ? 256 : 0; + case GLUT_WINDOW_X: + return g_curwin->xpos; + case GLUT_WINDOW_Y: + return g_curwin->ypos; + case GLUT_WINDOW_WIDTH: + return g_curwin->width; + case GLUT_WINDOW_HEIGHT: + return g_curwin->height; + case GLUT_WINDOW_STENCIL_SIZE: + return STENCIL_SIZE; + case GLUT_WINDOW_DEPTH_SIZE: + return DEPTH_SIZE; case GLUT_WINDOW_RGBA: return !(g_display_mode & GLUT_INDEX); + case GLUT_WINDOW_COLORMAP_SIZE: + return (g_display_mode & GLUT_INDEX) ? (256 - RESERVED_COLORS) : 0; + case GLUT_SCREEN_WIDTH: + return g_screen_w; + case GLUT_SCREEN_HEIGHT: + return g_screen_h; + case GLUT_INIT_WINDOW_X: + return g_init_x; + case GLUT_INIT_WINDOW_Y: + return g_init_y; + case GLUT_INIT_WINDOW_WIDTH: + return g_init_w; + case GLUT_INIT_WINDOW_HEIGHT: + return g_init_h; + case GLUT_INIT_DISPLAY_MODE: + return g_display_mode; case GLUT_ELAPSED_TIME: if (!timer_installed) { - timer_installed = !timer_installed; + timer_installed = GL_TRUE; LOCKDATA(ticks); LOCKFUNC(ticks_timer); pc_install_int(ticks_timer, NULL, FREQUENCY); } return ticks*1000/FREQUENCY; default: - return 0; + return -1; } } + int APIENTRY glutDeviceGet (GLenum type) { - return 0; + switch (type) { + case GLUT_HAS_KEYBOARD: + return GL_TRUE; + case GLUT_HAS_MOUSE: + return (g_mouse != 0); + case GLUT_NUM_MOUSE_BUTTONS: + return g_mouse; + case GLUT_HAS_SPACEBALL: + case GLUT_HAS_DIAL_AND_BUTTON_BOX: + case GLUT_HAS_TABLET: + return GL_FALSE; + case GLUT_NUM_SPACEBALL_BUTTONS: + case GLUT_NUM_BUTTON_BOX_BUTTONS: + case GLUT_NUM_DIALS: + case GLUT_NUM_TABLET_BUTTONS: + return 0; + default: + return -1; + } +} + + + +int APIENTRY glutGetModifiers (void) +{ + int mod = 0; + int shifts = pc_keyshifts(); + + if (shifts & (KB_SHIFT_FLAG | KB_CAPSLOCK_FLAG)) { + mod |= GLUT_ACTIVE_SHIFT; + } + + if (shifts & KB_ALT_FLAG) { + mod |= GLUT_ACTIVE_ALT; + } + + if (shifts & KB_CTRL_FLAG) { + mod |= GLUT_ACTIVE_CTRL; + } + + return mod; } diff --git a/src/glut/dos/window.c b/src/glut/dos/window.c index cce1a1f777..a7a7d9ca59 100644 --- a/src/glut/dos/window.c +++ b/src/glut/dos/window.c @@ -27,17 +27,16 @@ */ -#include "GL/glut.h" +#include "glutint.h" #include "GL/dmesa.h" -#include "internal.h" -static int window; +GLUTwindow *g_curwin; static DMesaVisual visual = NULL; static DMesaContext context = NULL; -static DMesaBuffer buffer[MAX_WINDOWS]; +static GLUTwindow *windows[MAX_WINDOWS]; @@ -45,8 +44,8 @@ static void clean (void) { int i; - for (i=0; inum = ++i; + w->xpos = g_init_x; + w->ypos = g_init_y; + w->width = m8width; + w->height = g_init_h; + w->buffer = b; + + return i; } } @@ -106,73 +119,88 @@ int APIENTRY glutCreateWindow (const char *title) } + int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height) { return GL_FALSE; } + void APIENTRY glutDestroyWindow (int win) { - if (buffer[win-1]) { - DMesaDestroyBuffer(buffer[win-1]); - buffer[win-1] = NULL; + if (windows[--win]) { + DMesaDestroyBuffer(windows[win]->buffer); + free(windows[win]); + windows[win] = NULL; } } + void APIENTRY glutPostRedisplay (void) { g_redisplay = GL_TRUE; } + void APIENTRY glutSwapBuffers (void) { - if (g_mouse) pc_scare_mouse(); - DMesaSwapBuffers(buffer[window]); - if (g_mouse) pc_unscare_mouse(); + if (g_curwin->show_mouse) { + /* XXX scare mouse */ + DMesaSwapBuffers(g_curwin->buffer); + /* XXX unscare mouse */ + } else { + DMesaSwapBuffers(g_curwin->buffer); + } } + int APIENTRY glutGetWindow (void) { - return window + 1; + return g_curwin->num; } + void APIENTRY glutSetWindow (int win) { - window = win - 1; + g_curwin = windows[win - 1]; } + void APIENTRY glutSetWindowTitle (const char *title) { } + void APIENTRY glutSetIconTitle (const char *title) { } + void APIENTRY glutPositionWindow (int x, int y) { - if (DMesaViewport(buffer[window], x, y, g_width, g_height)) { - g_xpos = x; - g_ypos = y; + if (DMesaMoveBuffer(x, y)) { + g_curwin->xpos = x; + g_curwin->ypos = y; } } + void APIENTRY glutReshapeWindow (int width, int height) -{ - if (DMesaViewport(buffer[window], g_xpos, g_ypos, width, height)) { - g_width = width; - g_height = height; - if (reshape_func) { - reshape_func(width, height); +{ + if (DMesaResizeBuffer(width, height)) { + g_curwin->width = width; + g_curwin->height = height; + if (g_curwin->reshape) { + g_curwin->reshape(width, height); } else { glViewport(0, 0, width, height); } @@ -180,26 +208,37 @@ void APIENTRY glutReshapeWindow (int width, int height) } + +void APIENTRY glutFullScreen (void) +{ +} + + + void APIENTRY glutPopWindow (void) { } + void APIENTRY glutPushWindow (void) { } + void APIENTRY glutIconifyWindow (void) { } + void APIENTRY glutShowWindow (void) { } + void APIENTRY glutHideWindow (void) { } -- cgit v1.2.3