* Hopefully I did THIS one right (used 'cvs update' to Merge)

Authors - The first update in quite a while

ChangeLog - Added the recent changes

freeglut_callbacks.c - Added Aleksandar Donev's menu destruction callback

freeglut_internal.h - Added the user data to the structures and made the menu state/status callbacks window-independent

freeglut_menu.c - Removed several OpenGL compiler warnings and added A. Donev's menu user data functions

freeglut_structure.c - Added Aleksandar Donev's menu destruction callback

freeglut_teapot.c - Removed or suppressed several compiler warnings

freeglut_window.c - Updated the window positioning code and added A. Donev's window user data

freeglut_ext.h - Added the menu destruction callback and user data functions


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@79 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
sandalle 2003-06-18 22:26:50 +00:00
parent eb6f583bb9
commit 77f40de0ba
10 changed files with 1922 additions and 1546 deletions

View File

@ -136,10 +136,6 @@ October 24, 2002:
(51) Changed "freeglut_state.c" so the "glutGet" calls with window position and size don't move the windows down and to the right one pixel. (51) Changed "freeglut_state.c" so the "glutGet" calls with window position and size don't move the windows down and to the right one pixel.
*******************************************************************************************
* Changes starting in May 2003
*******************************************************************************************
(52) Implement single-buffered rendering (or its emulation) in Windows. (52) Implement single-buffered rendering (or its emulation) in Windows.
(53) Implement Eero Pajarre's "GLUT_ICON" code. (53) Implement Eero Pajarre's "GLUT_ICON" code.
@ -150,10 +146,16 @@ October 24, 2002:
******************************************************************************************* *******************************************************************************************
* Changes on 17 June 2003 * Changes on 17-19 June 2003
******************************************************************************************* *******************************************************************************************
(56) Added glutGetProcAddress() (56) Added glutGetProcAddress()
(57) Added GLUT_FPS env var. (57) Added GLUT_FPS env var.
(58) Implemented Aleksandar Donev's user data changes: added user data fields to window and menu structures and implemented functions to get and set them
(59) Added a "MenuDestroy" callback which sets a function that "freeglut" calls when a menu is destroyed.

File diff suppressed because it is too large Load Diff

View File

@ -231,6 +231,13 @@ void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) )
glutCloseFunc( callback ); glutCloseFunc( callback );
} }
/* A. Donev: Destruction callback for menus */
void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )
{
if( fgStructure.Menu == NULL ) return;
fgStructure.Menu->Destroy = callback;
}
/* /*
* Deprecated version of glutMenuStatusFunc callback setting method * Deprecated version of glutMenuStatusFunc callback setting method
*/ */

View File

@ -160,7 +160,12 @@ static struct name_address_pair glut_functions[] = {
{ "glutLeaveMainLoop", (void *) glutLeaveMainLoop }, { "glutLeaveMainLoop", (void *) glutLeaveMainLoop },
{ "glutCloseFunc", (void *) glutCloseFunc }, { "glutCloseFunc", (void *) glutCloseFunc },
{ "glutWMCloseFunc", (void *) glutWMCloseFunc }, { "glutWMCloseFunc", (void *) glutWMCloseFunc },
{ "glutSetOption ", (void *) glutSetOption }, { "glutMenuDestroyFunc", (void *) glutMenuDestroyFunc },
{ "glutSetOption", (void *) glutSetOption },
{ "glutSetWindowData", (void *) glutSetWindowData },
{ "glutGetWindowData", (void *) glutGetWindowData },
{ "glutSetMenuData", (void *) glutSetMenuData },
{ "glutGetMenuData", (void *) glutGetMenuData },
{ "glutBitmapHeight", (void *) glutBitmapHeight }, { "glutBitmapHeight", (void *) glutBitmapHeight },
{ "glutStrokeHeight", (void *) glutStrokeHeight }, { "glutStrokeHeight", (void *) glutStrokeHeight },
{ "glutBitmapString", (void *) glutBitmapString }, { "glutBitmapString", (void *) glutBitmapString },

View File

@ -28,13 +28,6 @@
#ifndef FREEGLUT_INTERNAL_H #ifndef FREEGLUT_INTERNAL_H
#define FREEGLUT_INTERNAL_H #define FREEGLUT_INTERNAL_H
/*
* Be sure to update these for every release!
*/
#define VERSION_MAJOR 1
#define VERSION_MINOR 3
#define VERSION_PATCH 0
/* /*
* Freeglut is meant to be available under all Unix/X11 and Win32 platforms. * Freeglut is meant to be available under all Unix/X11 and Win32 platforms.
*/ */
@ -126,8 +119,6 @@ typedef void (* FGCBmotion )( int, int );
typedef void (* FGCBpassive )( int, int ); typedef void (* FGCBpassive )( int, int );
typedef void (* FGCBentry )( int ); typedef void (* FGCBentry )( int );
typedef void (* FGCBwindowStatus )( int ); typedef void (* FGCBwindowStatus )( int );
typedef void (* FGCBmenuState )( int );
typedef void (* FGCBmenuStatus )( int, int, int );
typedef void (* FGCBselect )( int, int, int ); typedef void (* FGCBselect )( int, int, int );
typedef void (* FGCBjoystick )( unsigned int, int, int, int ); typedef void (* FGCBjoystick )( unsigned int, int, int, int );
typedef void (* FGCBkeyboardUp )( unsigned char, int, int ); typedef void (* FGCBkeyboardUp )( unsigned char, int, int );
@ -147,6 +138,8 @@ typedef void (* FGCBdestroy )( void );
*/ */
typedef void (* FGCBidle )( void ); typedef void (* FGCBidle )( void );
typedef void (* FGCBtimer )( int ); typedef void (* FGCBtimer )( int );
typedef void (* FGCBmenuState )( int );
typedef void (* FGCBmenuStatus )( int, int, int );
/* /*
* The callback used when creating/using menus * The callback used when creating/using menus
@ -386,9 +379,11 @@ typedef struct tagSFG_Menu SFG_Menu;
struct tagSFG_Menu struct tagSFG_Menu
{ {
SFG_Node Node; SFG_Node Node;
void *UserData ; /* A. Donev: User data passed back at callback */
int ID; /* The global menu ID */ int ID; /* The global menu ID */
SFG_List Entries; /* The menu entries list */ SFG_List Entries; /* The menu entries list */
FGCBmenu Callback; /* The menu callback */ FGCBmenu Callback; /* The menu callback */
FGCBdestroy Destroy; /* A. Donev: Destruction callback */
GLboolean IsActive; /* Is the menu selected? */ GLboolean IsActive; /* Is the menu selected? */
int Width; /* Menu box width in pixels */ int Width; /* Menu box width in pixels */
int Height; /* Menu box height in pixels */ int Height; /* Menu box height in pixels */
@ -422,6 +417,7 @@ struct tagSFG_Window
SFG_Context Window; /* Window and OpenGL context */ SFG_Context Window; /* Window and OpenGL context */
SFG_WindowState State; /* The window state */ SFG_WindowState State; /* The window state */
SFG_WindowCallbacks Callbacks; /* The window callbacks */ SFG_WindowCallbacks Callbacks; /* The window callbacks */
void *UserData ; /* A. Donev: A pointer to user data used in rendering */
SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */ SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */
SFG_Menu* ActiveMenu; /* The window's active menu */ SFG_Menu* ActiveMenu; /* The window's active menu */

View File

@ -204,20 +204,20 @@ static void fghDisplayMenuBox( SFG_Menu* menu )
* Have the menu box drawn first. The +- values are * Have the menu box drawn first. The +- values are
* here just to make it more nice-looking... * here just to make it more nice-looking...
*/ */
glColor4f( 0.0, 0.0, 0.0, 1.0 ); glColor4f( 0.0f, 0.0f, 0.0f, 1.0f );
glBegin( GL_QUADS ); glBegin( GL_QUADS );
glVertex2f( menu->X , menu->Y - 1 ); glVertex2i( menu->X , menu->Y - 1 );
glVertex2f( menu->X + menu->Width, menu->Y - 1 ); glVertex2i( menu->X + menu->Width, menu->Y - 1 );
glVertex2f( menu->X + menu->Width, menu->Y + 4 + menu->Height ); glVertex2i( menu->X + menu->Width, menu->Y + 4 + menu->Height );
glVertex2f( menu->X , menu->Y + 4 + menu->Height ); glVertex2i( menu->X , menu->Y + 4 + menu->Height );
glEnd(); glEnd();
glColor4f( 0.3, 0.4, 0.5, 1.0 ); glColor4f( 0.3f, 0.4f, 0.5f, 1.0f );
glBegin( GL_QUADS ); glBegin( GL_QUADS );
glVertex2f( menu->X - 2 , menu->Y + 1 ); glVertex2i( menu->X - 2 , menu->Y + 1 );
glVertex2f( menu->X - 2 + menu->Width, menu->Y + 1 ); glVertex2i( menu->X - 2 + menu->Width, menu->Y + 1 );
glVertex2f( menu->X - 2 + menu->Width, menu->Y + 2 + menu->Height ); glVertex2i( menu->X - 2 + menu->Width, menu->Y + 2 + menu->Height );
glVertex2f( menu->X - 2 , menu->Y + 2 + menu->Height ); glVertex2i( menu->X - 2 , menu->Y + 2 + menu->Height );
glEnd(); glEnd();
/* /*
@ -241,12 +241,12 @@ static void fghDisplayMenuBox( SFG_Menu* menu )
/* /*
* So have the highlight drawn... * So have the highlight drawn...
*/ */
glColor4f( 0.2, 0.3, 0.4, 1.0 ); glColor4f( 0.2f, 0.3f, 0.4f, 1.0f );
glBegin( GL_QUADS ); glBegin( GL_QUADS );
glVertex2f( menu->X - 2 , menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 ); glVertex2i( menu->X - 2 , menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 );
glVertex2f( menu->X - 2 + menu->Width, menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 ); glVertex2i( menu->X - 2 + menu->Width, menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 );
glVertex2f( menu->X - 2 + menu->Width, menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 ); glVertex2i( menu->X - 2 + menu->Width, menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 );
glVertex2f( menu->X - 2 , menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 ); glVertex2i( menu->X - 2 , menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 );
glEnd(); glEnd();
} }
} }
@ -844,4 +844,17 @@ void FGAPIENTRY glutDetachMenu( int button )
fgStructure.Window->Menu[ button ] = NULL; fgStructure.Window->Menu[ button ] = NULL;
} }
/*
* A.Donev: Set and retrieve the menu's user data
*/
void* FGAPIENTRY glutGetMenuData( void )
{
return(fgStructure.Menu->UserData);
}
void FGAPIENTRY glutSetMenuData(void* data)
{
fgStructure.Menu->UserData=data;
}
/*** END OF FILE ***/ /*** END OF FILE ***/

View File

@ -252,6 +252,7 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
/* /*
* If the programmer defined a destroy callback, call it * If the programmer defined a destroy callback, call it
* A. Donev: But first make this the active window
*/ */
if ( window->Callbacks.Destroy != NULL ) if ( window->Callbacks.Destroy != NULL )
{ {
@ -358,6 +359,18 @@ void fgDestroyMenu( SFG_Menu* menu )
fghRemoveMenuFromMenu( from, menu ); fghRemoveMenuFromMenu( from, menu );
} }
/*
* If the programmer defined a destroy callback, call it
* A. Donev: But first make this the active menu
*/
if ( menu->Destroy != NULL )
{
SFG_Menu *activeMenu=fgStructure.Menu;
fgStructure.Menu = menu;
menu->Destroy () ;
fgStructure.Menu = activeMenu;
}
/* /*
* Now we are pretty sure the menu is not used anywhere * Now we are pretty sure the menu is not used anywhere
* and that we can remove all of its entries * and that we can remove all of its entries

View File

@ -80,7 +80,9 @@
#include "../include/GL/freeglut.h" #include "../include/GL/freeglut.h"
#include "freeglut_internal.h" #include "freeglut_internal.h"
#ifdef TARGET_HOST_WIN32
#pragma warning ( once:4305 )
#endif
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
@ -166,7 +168,7 @@ static void teapot( GLint grid, GLdouble scale, GLenum type )
glPushMatrix(); glPushMatrix();
glRotatef(270.0, 1.0, 0.0, 0.0); glRotatef(270.0, 1.0, 0.0, 0.0);
glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale); glScaled(0.5 * scale, 0.5 * scale, 0.5 * scale);
glTranslatef(0.0, 0.0, -1.5); glTranslatef(0.0, 0.0, -1.5);
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {

View File

@ -555,12 +555,10 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
if ( !isSubWindow ) if ( !isSubWindow )
{ {
/* /*
* Update the window position and dimensions, taking account of window decorations * Update the window dimensions, taking account of window decorations.
* "freeglut" is to create the window with the outside of its border at (x,y)
* and with dimensions (w,h).
*/ */
x -= (GetSystemMetrics( SM_CXSIZEFRAME ) );
y -= (GetSystemMetrics( SM_CYSIZEFRAME ) + GetSystemMetrics( SM_CYCAPTION ) );
if ( y < 0 ) y = 0 ;
w += (GetSystemMetrics( SM_CXSIZEFRAME ) )*2; w += (GetSystemMetrics( SM_CXSIZEFRAME ) )*2;
h += (GetSystemMetrics( SM_CYSIZEFRAME ) )*2 + GetSystemMetrics( SM_CYCAPTION ); h += (GetSystemMetrics( SM_CYSIZEFRAME ) )*2 + GetSystemMetrics( SM_CYCAPTION );
} }
@ -1030,8 +1028,8 @@ void FGAPIENTRY glutReshapeWindow( int width, int height )
/* /*
* Adjust the size of the window to allow for the size of the frame * Adjust the size of the window to allow for the size of the frame
*/ */
width += (GetSystemMetrics( SM_CXSIZEFRAME ) - 1)*2; width += GetSystemMetrics( SM_CXSIZEFRAME ) * 2;
height += (GetSystemMetrics( SM_CYSIZEFRAME ) - 1)*2 + GetSystemMetrics( SM_CYCAPTION ); height += GetSystemMetrics( SM_CYSIZEFRAME ) * 2 + GetSystemMetrics( SM_CYCAPTION );
} }
else /* This is a subwindow, get the parent window's position and subtract it off */ else /* This is a subwindow, get the parent window's position and subtract it off */
{ {
@ -1078,16 +1076,6 @@ void FGAPIENTRY glutPositionWindow( int x, int y )
*/ */
GetWindowRect( fgStructure.Window->Window.Handle, &winRect ); GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
if ( fgStructure.Window->Parent == NULL ) /* If this is not a subwindow ... */
{
/*
* Adjust the position of the window to allow for the size of the frame
*/
x -= (GetSystemMetrics( SM_CXSIZEFRAME ) - 1);
y -= (GetSystemMetrics( SM_CYSIZEFRAME ) - 1 + GetSystemMetrics( SM_CYCAPTION ));
if ( y < 0 ) y = 0 ;
}
/* /*
* Reposition the window, forcing a redraw to happen * Reposition the window, forcing a redraw to happen
*/ */
@ -1176,6 +1164,19 @@ void FGAPIENTRY glutFullScreen( void )
); );
} }
/*
* A.Donev: Set and retrieve the window's user data
*/
void* FGAPIENTRY glutGetWindowData( void )
{
return(fgStructure.Window->UserData);
}
void FGAPIENTRY glutSetWindowData(void* data)
{
fgStructure.Window->UserData=data;
}
/*** END OF FILE ***/ /*** END OF FILE ***/

View File

@ -47,12 +47,6 @@
#define GLUT_WINDOW_BORDER_WIDTH 0x01FA #define GLUT_WINDOW_BORDER_WIDTH 0x01FA
#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB #define GLUT_WINDOW_HEADER_HEIGHT 0x01FB
/*
* Runtime version checking with glutGet
*/
#define GLUT_VERSION 0x01FC
/* /*
* Process loop function, see freeglut_main.c * Process loop function, see freeglut_main.c
*/ */
@ -64,11 +58,18 @@ FGAPI void FGAPIENTRY glutLeaveMainLoop( void );
*/ */
FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ); FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) );
FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ); FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) );
/* A. Donev: Also a destruction callback for menus */
FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) );
/* /*
* State setting and retrieval functions, see freeglut_state.c * State setting and retrieval functions, see freeglut_state.c
*/ */
FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ) ; FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ) ;
/* A.Donev: User-data manipulation */
FGAPI void* FGAPIENTRY glutGetWindowData( void );
FGAPI void FGAPIENTRY glutSetWindowData(void* data);
FGAPI void* FGAPIENTRY glutGetMenuData( void );
FGAPI void FGAPIENTRY glutSetMenuData(void* data);
/* /*
* Font stuff, see freeglut_font.c * Font stuff, see freeglut_font.c