From: <fa...@us...> - 2012-01-20 04:20:34
|
Revision: 988 http://freeglut.svn.sourceforge.net/freeglut/?rev=988&view=rev Author: fayjf Date: 2012-01-20 04:20:28 +0000 (Fri, 20 Jan 2012) Log Message: ----------- Removing some duplicate code from "freeglut_init.c" and its Windows version Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_init.c trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_init.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-20 04:10:00 UTC (rev 987) +++ trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-20 04:20:28 UTC (rev 988) @@ -322,8 +322,7 @@ #endif -#if TARGET_HOST_POSIX_X11 -static void fghDeinitialiseInputDevices ( void ) +void fghCloseInputDevices ( void ) { if ( fgState.JoysticksInitialised ) fgJoystickClose( ); @@ -336,6 +335,16 @@ } +#if TARGET_HOST_POSIX_X11 +static void fghDeinitialiseInputDevices ( void ) +{ + fghCloseInputDevices (); + + fgState.JoysticksInitialised = GL_FALSE; + fgState.InputDevsInitialised = GL_FALSE; +} + + static void fghCloseDisplay ( void ) { /* Modified: trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-20 04:10:00 UTC (rev 987) +++ trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-20 04:20:28 UTC (rev 988) @@ -129,14 +129,12 @@ /* Platform-Specific Deinitialization Functions: */ +extern void fghCloseInputDevices ( void ); + void fghDeinitialiseInputDevices ( void ) { #if !defined(_WIN32_WCE) - if ( fgState.JoysticksInitialised ) - fgJoystickClose( ); - - if ( fgState.InputDevsInitialised ) - fgInputDeviceClose( ); + fghCloseInputDevices (); #endif /* !defined(_WIN32_WCE) */ fgState.JoysticksInitialised = GL_FALSE; fgState.InputDevsInitialised = GL_FALSE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-22 01:43:03
|
Revision: 992 http://freeglut.svn.sourceforge.net/freeglut/?rev=992&view=rev Author: fayjf Date: 2012-01-22 01:42:57 +0000 (Sun, 22 Jan 2012) Log Message: ----------- Splitting the Windows-specific input device code into its own file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c 2012-01-22 01:32:31 UTC (rev 991) +++ trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c 2012-01-22 01:42:57 UTC (rev 992) @@ -46,22 +46,16 @@ #include <termios.h> #include <fcntl.h> -typedef struct { +struct { int fd; struct termios termio, termio_save; -} SERIALPORT; +} _serialport; -#elif TARGET_HOST_MS_WINDOWS -#include <sys/types.h> -#include <winbase.h> -typedef struct { - HANDLE fh; - COMMTIMEOUTS timeouts_save; - DCB dcb_save; -} SERIALPORT; - #endif +typedef struct _serialport SERIALPORT; + + /********************* Dialbox definitions ***********************/ #define DIAL_NUM_VALUATORS 8 @@ -99,12 +93,13 @@ /*****************************************************************/ -static SERIALPORT *serial_open ( const char *device ); -static void serial_close ( SERIALPORT *port ); -static int serial_getchar ( SERIALPORT *port ); -static int serial_putchar ( SERIALPORT *port, unsigned char ch ); -static void serial_flush ( SERIALPORT *port ); +extern SERIALPORT *serial_open ( const char *device ); +extern void serial_close ( SERIALPORT *port ); +extern int serial_getchar ( SERIALPORT *port ); +extern int serial_putchar ( SERIALPORT *port, unsigned char ch ); +extern void serial_flush ( SERIALPORT *port ); +extern void fghRegisterDialDevice ( const char *dial_device ); static void send_dial_event(int dial, int value); static void poll_dials(int id); @@ -132,26 +127,20 @@ /* * Try initializing the input device(s) */ +#if TARGET_HOST_POSIX_X11 +static void fghRegisterDialDevice ( const char *dial_device ) +{ +} +#endif + void fgInitialiseInputDevices ( void ) { if( !fgState.InputDevsInitialised ) { const char *dial_device=NULL; dial_device = getenv ( "GLUT_DIALS_SERIAL" ); -#if TARGET_HOST_MS_WINDOWS - if (!dial_device){ - static char devname[256]; - DWORD size=sizeof(devname); - DWORD type = REG_SZ; - HKEY key; - if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\FreeGLUT",&key)==ERROR_SUCCESS) { - if (RegQueryValueExA(key,"DialboxSerialPort",NULL,&type,(LPBYTE)devname,&size)==ERROR_SUCCESS){ - dial_device=devname; - } - RegCloseKey(key); - } - } -#endif + fghRegisterDialDevice ( dial_device ); + if ( !dial_device ) return; if ( !( dialbox_port = serial_open ( dial_device ) ) ) return; serial_putchar(dialbox_port,DIAL_INITIALIZE); @@ -311,68 +300,4 @@ tcflush ( port->fd, TCIOFLUSH ); } -#elif TARGET_HOST_MS_WINDOWS - -static SERIALPORT *serial_open(const char *device){ - HANDLE fh; - DCB dcb={sizeof(DCB)}; - COMMTIMEOUTS timeouts; - SERIALPORT *port; - - fh = CreateFile(device,GENERIC_READ|GENERIC_WRITE,0,NULL, - OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); - if (!fh) return NULL; - - port = malloc(sizeof(SERIALPORT)); - ZeroMemory(port, sizeof(SERIALPORT)); - port->fh = fh; - - /* save current port settings */ - GetCommState(fh,&port->dcb_save); - GetCommTimeouts(fh,&port->timeouts_save); - - dcb.DCBlength=sizeof(DCB); - BuildCommDCB("96,n,8,1",&dcb); - SetCommState(fh,&dcb); - - ZeroMemory(&timeouts,sizeof(timeouts)); - timeouts.ReadTotalTimeoutConstant=1; - timeouts.WriteTotalTimeoutConstant=1; - SetCommTimeouts(fh,&timeouts); - - serial_flush(port); - - return port; -} - -static void serial_close(SERIALPORT *port){ - if (port){ - /* restore old port settings */ - SetCommState(port->fh,&port->dcb_save); - SetCommTimeouts(port->fh,&port->timeouts_save); - CloseHandle(port->fh); - free(port); - } -} - -static int serial_getchar(SERIALPORT *port){ - DWORD n; - unsigned char ch; - if (!port) return EOF; - if (!ReadFile(port->fh,&ch,1,&n,NULL)) return EOF; - if (n==1) return ch; - return EOF; -} - -static int serial_putchar(SERIALPORT *port, unsigned char ch){ - DWORD n; - if (!port) return 0; - return WriteFile(port->fh,&ch,1,&n,NULL); -} - -static void serial_flush ( SERIALPORT *port ) -{ - FlushFileBuffers(port->fh); -} - #endif Modified: trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c 2012-01-22 01:32:31 UTC (rev 991) +++ trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c 2012-01-22 01:42:57 UTC (rev 992) @@ -0,0 +1,127 @@ +/* + * freeglut_input_devices_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sat Jan 21, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "freeglut_internal_mswin.h" + +#include <sys/types.h> +#include <winbase.h> + +typedef struct { + HANDLE fh; + COMMTIMEOUTS timeouts_save; + DCB dcb_save; +} SERIALPORT; + +/* Serial Port Prototypes */ +SERIALPORT *serial_open ( const char *device ); +void serial_close ( SERIALPORT *port ); +int serial_getchar ( SERIALPORT *port ); +int serial_putchar ( SERIALPORT *port, unsigned char ch ); +void serial_flush ( SERIALPORT *port ); + + +void fghRegisterDialDevice ( const char *dial_device ) +{ + if (!dial_device){ + static char devname[256]; + DWORD size=sizeof(devname); + DWORD type = REG_SZ; + HKEY key; + if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\FreeGLUT",&key)==ERROR_SUCCESS) { + if (RegQueryValueExA(key,"DialboxSerialPort",NULL,&type,(LPBYTE)devname,&size)==ERROR_SUCCESS){ + dial_device=devname; + } + RegCloseKey(key); + } + } +} + + +/* Serial Port Functions */ +SERIALPORT *serial_open(const char *device){ + HANDLE fh; + DCB dcb={sizeof(DCB)}; + COMMTIMEOUTS timeouts; + SERIALPORT *port; + + fh = CreateFile(device,GENERIC_READ|GENERIC_WRITE,0,NULL, + OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if (!fh) return NULL; + + port = malloc(sizeof(SERIALPORT)); + ZeroMemory(port, sizeof(SERIALPORT)); + port->fh = fh; + + /* save current port settings */ + GetCommState(fh,&port->dcb_save); + GetCommTimeouts(fh,&port->timeouts_save); + + dcb.DCBlength=sizeof(DCB); + BuildCommDCB("96,n,8,1",&dcb); + SetCommState(fh,&dcb); + + ZeroMemory(&timeouts,sizeof(timeouts)); + timeouts.ReadTotalTimeoutConstant=1; + timeouts.WriteTotalTimeoutConstant=1; + SetCommTimeouts(fh,&timeouts); + + serial_flush(port); + + return port; +} + +void serial_close(SERIALPORT *port){ + if (port){ + /* restore old port settings */ + SetCommState(port->fh,&port->dcb_save); + SetCommTimeouts(port->fh,&port->timeouts_save); + CloseHandle(port->fh); + free(port); + } +} + +int serial_getchar(SERIALPORT *port){ + DWORD n; + unsigned char ch; + if (!port) return EOF; + if (!ReadFile(port->fh,&ch,1,&n,NULL)) return EOF; + if (n==1) return ch; + return EOF; +} + +int serial_putchar(SERIALPORT *port, unsigned char ch){ + DWORD n; + if (!port) return 0; + return WriteFile(port->fh,&ch,1,&n,NULL); +} + +void serial_flush ( SERIALPORT *port ) +{ + FlushFileBuffers(port->fh); +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-22 01:48:21
|
Revision: 993 http://freeglut.svn.sourceforge.net/freeglut/?rev=993&view=rev Author: fayjf Date: 2012-01-22 01:48:15 +0000 (Sun, 22 Jan 2012) Log Message: ----------- Splitting out more Windows-specific code in "freeglut_init.c" Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_init.c trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_init.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-22 01:42:57 UTC (rev 992) +++ trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-22 01:48:15 UTC (rev 993) @@ -565,40 +565,8 @@ fgState.Initialised = GL_FALSE; } -/* - * Everything inside the following #ifndef is copied from the X sources. - */ -#if TARGET_HOST_MS_WINDOWS - -/* - -Copyright 1985, 1986, 1987,1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -*/ - +#if defined TARGET_HOST_MS_WINDOWS #define NoValue 0x0000 #define XValue 0x0001 #define YValue 0x0002 @@ -608,132 +576,12 @@ #define XNegative 0x0010 #define YNegative 0x0020 -/* - * XParseGeometry parses strings of the form - * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where - * width, height, xoffset, and yoffset are unsigned integers. - * Example: "=80x24+300-49" - * The equal sign is optional. - * It returns a bitmask that indicates which of the four values - * were actually found in the string. For each value found, - * the corresponding argument is updated; for each value - * not found, the corresponding argument is left unchanged. - */ - -static int -ReadInteger(char *string, char **NextString) -{ - register int Result = 0; - int Sign = 1; - - if (*string == '+') - string++; - else if (*string == '-') - { - string++; - Sign = -1; - } - for (; (*string >= '0') && (*string <= '9'); string++) - { - Result = (Result * 10) + (*string - '0'); - } - *NextString = string; - if (Sign >= 0) - return Result; - else - return -Result; -} - -static int XParseGeometry ( +extern int XParseGeometry ( const char *string, int *x, int *y, unsigned int *width, /* RETURN */ - unsigned int *height) /* RETURN */ -{ - int mask = NoValue; - register char *strind; - unsigned int tempWidth = 0, tempHeight = 0; - int tempX = 0, tempY = 0; - char *nextCharacter; - - if ( (string == NULL) || (*string == '\0')) - return mask; - if (*string == '=') - string++; /* ignore possible '=' at beg of geometry spec */ - - strind = (char *)string; - if (*strind != '+' && *strind != '-' && *strind != 'x') { - tempWidth = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= WidthValue; - } - - if (*strind == 'x' || *strind == 'X') { - strind++; - tempHeight = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= HeightValue; - } - - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempX = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= XNegative; - } - else - { - strind++; - tempX = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - } - mask |= XValue; - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempY = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= YNegative; - } - else - { - strind++; - tempY = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - } - mask |= YValue; - } - } - - /* If strind isn't at the end of the string the it's an invalid - geometry specification. */ - - if (*strind != '\0') return 0; - - if (mask & XValue) - *x = tempX; - if (mask & YValue) - *y = tempY; - if (mask & WidthValue) - *width = tempWidth; - if (mask & HeightValue) - *height = tempHeight; - return mask; -} + unsigned int *height); /* RETURN */ #endif /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-22 01:42:57 UTC (rev 992) +++ trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-22 01:48:15 UTC (rev 993) @@ -154,5 +154,173 @@ +/* + * Everything down to the end of the next two functions is copied from the X sources. + */ +/* +Copyright 1985, 1986, 1987,1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * XParseGeometry parses strings of the form + * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where + * width, height, xoffset, and yoffset are unsigned integers. + * Example: "=80x24+300-49" + * The equal sign is optional. + * It returns a bitmask that indicates which of the four values + * were actually found in the string. For each value found, + * the corresponding argument is updated; for each value + * not found, the corresponding argument is left unchanged. + */ + +static int +ReadInteger(char *string, char **NextString) +{ + register int Result = 0; + int Sign = 1; + + if (*string == '+') + string++; + else if (*string == '-') + { + string++; + Sign = -1; + } + for (; (*string >= '0') && (*string <= '9'); string++) + { + Result = (Result * 10) + (*string - '0'); + } + *NextString = string; + if (Sign >= 0) + return Result; + else + return -Result; +} + +int XParseGeometry ( + const char *string, + int *x, + int *y, + unsigned int *width, /* RETURN */ + unsigned int *height) /* RETURN */ +{ + int mask = NoValue; + register char *strind; + unsigned int tempWidth = 0, tempHeight = 0; + int tempX = 0, tempY = 0; + char *nextCharacter; + + if ( (string == NULL) || (*string == '\0')) + return mask; + if (*string == '=') + string++; /* ignore possible '=' at beg of geometry spec */ + + strind = (char *)string; + if (*strind != '+' && *strind != '-' && *strind != 'x') { + tempWidth = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= WidthValue; + } + + if (*strind == 'x' || *strind == 'X') { + strind++; + tempHeight = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= HeightValue; + } + + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempX = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= XNegative; + } + else + { + strind++; + tempX = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + } + mask |= XValue; + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempY = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + mask |= YNegative; + } + else + { + strind++; + tempY = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return 0; + strind = nextCharacter; + } + mask |= YValue; + } + } + + /* If strind isn't at the end of the string the it's an invalid + geometry specification. */ + + if (*strind != '\0') return 0; + + if (mask & XValue) + *x = tempX; + if (mask & YValue) + *y = tempY; + if (mask & WidthValue) + *width = tempWidth; + if (mask & HeightValue) + *height = tempHeight; + return mask; +} + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-22 06:21:56
|
Revision: 994 http://freeglut.svn.sourceforge.net/freeglut/?rev=994&view=rev Author: fayjf Date: 2012-01-22 06:21:50 +0000 (Sun, 22 Jan 2012) Log Message: ----------- Moving some Windows-specific code out of "freeglut_main.c" into the Windows-specific file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_main.c trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_main.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-22 01:48:15 UTC (rev 993) +++ trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-22 06:21:50 UTC (rev 994) @@ -77,6 +77,12 @@ static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF; #endif +extern void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ); +extern void fghcbPlatformDisplayWindow ( SFG_Window *window ); +extern void fghPlatformSleepForEvents( long msec ); +extern void fghProcessSingleEvent ( void ); + + /* * TODO BEFORE THE STABLE RELEASE: * @@ -95,66 +101,23 @@ * callback is hooked, the viewport size is updated to * match the new window size. */ -static void fghReshapeWindow ( SFG_Window *window, int width, int height ) -{ - SFG_Window *current_window = fgStructure.CurrentWindow; - - freeglut_return_if_fail( window != NULL ); - #if TARGET_HOST_POSIX_X11 - +static void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ) +{ XResizeWindow( fgDisplay.Display, window->Window.Handle, width, height ); XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} +#endif -#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - { - RECT windowRect; +static void fghReshapeWindow ( SFG_Window *window, int width, int height ) +{ + SFG_Window *current_window = fgStructure.CurrentWindow; - /* - * For windowed mode, get the current position of the - * window and resize taking the size of the frame - * decorations into account. - */ + freeglut_return_if_fail( window != NULL ); - /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ - GetWindowRect( window->Window.Handle, &windowRect ); + fghPlatformReshapeWindow ( window, width, height ); - /* Create rect in FreeGLUT format, (X,Y) topleft outside window, WxH of client area */ - windowRect.right = windowRect.left+width; - windowRect.bottom = windowRect.top+height; - - if (window->Parent == NULL) - /* get the window rect from this to feed to SetWindowPos, correct for window decorations */ - fghComputeWindowRectFromClientArea_QueryWindow(window,&windowRect,TRUE); - else - { - /* correct rect for position client area of parent window - * (SetWindowPos input for child windows is in coordinates - * relative to the parent's client area). - * Child windows don't have decoration, so no need to correct - * for them. - */ - RECT parentRect; - parentRect = fghGetClientArea( window->Parent, FALSE ); - windowRect.left -= parentRect.left; - windowRect.right -= parentRect.left; - windowRect.top -= parentRect.top; - windowRect.bottom -= parentRect.top; - } - - /* Do the actual resizing */ - SetWindowPos( window->Window.Handle, - HWND_TOP, - windowRect.left, windowRect.top, - windowRect.right - windowRect.left, - windowRect.bottom- windowRect.top, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | - SWP_NOZORDER - ); - } -#endif - if( FETCH_WCB( *window, Reshape ) ) INVOKE_WCB( *window, Reshape, ( width, height ) ); else @@ -212,6 +175,13 @@ /* * A static helper function to execute display callback for a window */ +#if TARGET_HOST_POSIX_X11 +static void fghcbPlatformDisplayWindow ( SFG_Window *window ) +{ + fghRedrawWindow ( window ) ; +} +#endif + static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) { @@ -219,16 +189,7 @@ window->State.Visible ) { window->State.Redisplay = GL_FALSE; - -#if TARGET_HOST_POSIX_X11 - fghRedrawWindow ( window ) ; -#elif TARGET_HOST_MS_WINDOWS - - RedrawWindow( - window->Window.Handle, NULL, NULL, - RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW - ); -#endif + fghcbPlatformDisplayWindow ( window ); } fgEnumSubWindows( window, fghcbDisplayWindow, enumerator ); @@ -459,20 +420,10 @@ * Does the magic required to relinquish the CPU until something interesting * happens. */ -static void fghSleepForEvents( void ) -{ - long msec; - if( fgState.IdleCallback || fghHavePendingRedisplays( ) ) - return; - - msec = fghNextTimer( ); - /* XXX Use GLUT timers for joysticks... */ - /* XXX Dumb; forces granularity to .01sec */ - if( fghHaveJoystick( ) && ( msec > 10 ) ) - msec = 10; - #if TARGET_HOST_POSIX_X11 +static void fghPlatformSleepForEvents( long msec ) +{ /* * Possibly due to aggressive use of XFlush() and friends, * it is possible to have our socket drained but still have @@ -501,9 +452,23 @@ fgWarning ( "freeglut select() error: %d", errno ); #endif } -#elif TARGET_HOST_MS_WINDOWS - MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT ); +} #endif + +static void fghSleepForEvents( void ) +{ + long msec; + + if( fgState.IdleCallback || fghHavePendingRedisplays( ) ) + return; + + msec = fghNextTimer( ); + /* XXX Use GLUT timers for joysticks... */ + /* XXX Dumb; forces granularity to .01sec */ + if( fghHaveJoystick( ) && ( msec > 10 ) ) + msec = 10; + + fghPlatformSleepForEvents ( msec ); } #if TARGET_HOST_POSIX_X11 @@ -523,10 +488,8 @@ return ret; } -#endif -#if TARGET_HOST_POSIX_X11 && _DEBUG static const char* fghTypeToString( int type ) { @@ -968,16 +931,9 @@ } } -#endif -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Executes a single iteration in the freeglut processing loop. - */ -void FGAPIENTRY glutMainLoopEvent( void ) +void fghProcessSingleEvent ( void ) { -#if TARGET_HOST_POSIX_X11 SFG_Window* window; XEvent event; @@ -1452,33 +1408,18 @@ break; } } +} +#endif -#elif TARGET_HOST_MS_WINDOWS +/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - MSG stMsg; +/* + * Executes a single iteration in the freeglut processing loop. + */ +void FGAPIENTRY glutMainLoopEvent( void ) +{ + fghProcessSingleEvent (); - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" ); - - while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 ) - { - if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) - { - fgDeinitialize( ); - exit( 0 ); - } - else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS ) - fgState.ExecState = GLUT_EXEC_STATE_STOP; - - return; - } - - TranslateMessage( &stMsg ); - DispatchMessage( &stMsg ); - } -#endif - if( fgState.Timers.First ) fghCheckTimers( ); fghCheckJoystickPolls( ); Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-22 01:48:15 UTC (rev 993) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-22 06:21:50 UTC (rev 994) @@ -0,0 +1,123 @@ +/* + * freeglut_main_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sat Jan 21, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "freeglut_internal_mswin.h" + + + + +void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ) +{ + RECT windowRect; + + /* + * For windowed mode, get the current position of the + * window and resize taking the size of the frame + * decorations into account. + */ + + /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ + GetWindowRect( window->Window.Handle, &windowRect ); + + /* Create rect in FreeGLUT format, (X,Y) topleft outside window, WxH of client area */ + windowRect.right = windowRect.left+width; + windowRect.bottom = windowRect.top+height; + + if (window->Parent == NULL) + /* get the window rect from this to feed to SetWindowPos, correct for window decorations */ + fghComputeWindowRectFromClientArea_QueryWindow(window,&windowRect,TRUE); + else + { + /* correct rect for position client area of parent window + * (SetWindowPos input for child windows is in coordinates + * relative to the parent's client area). + * Child windows don't have decoration, so no need to correct + * for them. + */ + RECT parentRect; + parentRect = fghGetClientArea( window->Parent, FALSE ); + windowRect.left -= parentRect.left; + windowRect.right -= parentRect.left; + windowRect.top -= parentRect.top; + windowRect.bottom -= parentRect.top; + } + + /* Do the actual resizing */ + SetWindowPos( window->Window.Handle, + HWND_TOP, + windowRect.left, windowRect.top, + windowRect.right - windowRect.left, + windowRect.bottom- windowRect.top, + SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | + SWP_NOZORDER + ); +} + + +void fghcbPlatformDisplayWindow ( SFG_Window *window ) +{ + RedrawWindow( + window->Window.Handle, NULL, NULL, + RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW + ); +} + + +void fghPlatformSleepForEvents( long msec ) +{ + MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT ); +} + + +void fghProcessSingleEvent ( void ) +{ + MSG stMsg; + + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" ); + + while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) ) + { + if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 ) + { + if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) + { + fgDeinitialize( ); + exit( 0 ); + } + else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS ) + fgState.ExecState = GLUT_EXEC_STATE_STOP; + + return; + } + + TranslateMessage( &stMsg ); + DispatchMessage( &stMsg ); + } +} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 02:46:22
|
Revision: 996 http://freeglut.svn.sourceforge.net/freeglut/?rev=996&view=rev Author: fayjf Date: 2012-01-23 02:46:16 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Splitting a little Windows-specific menu code into its own file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_menu.c trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_menu.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-22 19:25:56 UTC (rev 995) +++ trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-23 02:46:16 UTC (rev 996) @@ -84,6 +84,9 @@ static float menu_pen_hback [4] = {1.0f, 1.0f, 1.0f, 1.0f}; #endif + +extern GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ); + /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ /* @@ -139,27 +142,28 @@ /* * Private function to get the virtual maximum screen extent */ -static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y ) +#if TARGET_HOST_POSIX_X11 +static GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) { - if( fgStructure.GameModeWindow ) - { -#if TARGET_HOST_POSIX_X11 - int wx, wy; - Window w; + int wx, wy; + Window w; - XTranslateCoordinates( - fgDisplay.Display, - window->Window.Handle, - fgDisplay.RootWindow, - 0, 0, &wx, &wy, &w); + XTranslateCoordinates( + fgDisplay.Display, + window->Window.Handle, + fgDisplay.RootWindow, + 0, 0, &wx, &wy, &w); - *x = fgState.GameModeSize.X + wx; - *y = fgState.GameModeSize.Y + wy; -#else - *x = glutGet ( GLUT_SCREEN_WIDTH ); - *y = glutGet ( GLUT_SCREEN_HEIGHT ); + *x = fgState.GameModeSize.X + wx; + *y = fgState.GameModeSize.Y + wy; +} #endif - } + + +static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y ) +{ + if( fgStructure.GameModeWindow ) + fghGetGameModeVMaxExtent ( window, x, y ); else { *x = fgDisplay.ScreenWidth; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-22 19:25:56 UTC (rev 995) +++ trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-23 02:46:16 UTC (rev 996) @@ -0,0 +1,36 @@ +/* + * freeglut_menu_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sun Jan 22, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "freeglut_internal_mswin.h" + + +GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) +{ + *x = glutGet ( GLUT_SCREEN_WIDTH ); + *y = glutGet ( GLUT_SCREEN_HEIGHT ); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 04:06:54
|
Revision: 997 http://freeglut.svn.sourceforge.net/freeglut/?rev=997&view=rev Author: fayjf Date: 2012-01-23 04:06:48 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Moving Windows-specific "glutGet" code into its own file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_state.c trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_state.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 02:46:16 UTC (rev 996) +++ trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 04:06:48 UTC (rev 997) @@ -41,6 +41,8 @@ * The fail-on-call policy will help adding the most needed things imho. */ +extern int fgPlatformGlutGet ( GLenum eWhat ); + /* -- LOCAL DEFINITIONS ---------------------------------------------------- */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ @@ -62,129 +64,13 @@ return returnValue; } -#endif -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * General settings assignment method - */ -void FGAPIENTRY glutSetOption( GLenum eWhat, int value ) +static int fgPlatformGlutGet ( GLenum eWhat ) { - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" ); - - /* - * XXX In chronological code add order. (WHY in that order?) - */ - switch( eWhat ) - { - case GLUT_INIT_WINDOW_X: - fgState.Position.X = (GLint)value; - break; - - case GLUT_INIT_WINDOW_Y: - fgState.Position.Y = (GLint)value; - break; - - case GLUT_INIT_WINDOW_WIDTH: - fgState.Size.X = (GLint)value; - break; - - case GLUT_INIT_WINDOW_HEIGHT: - fgState.Size.Y = (GLint)value; - break; - - case GLUT_INIT_DISPLAY_MODE: - fgState.DisplayMode = (unsigned int)value; - break; - - case GLUT_ACTION_ON_WINDOW_CLOSE: - fgState.ActionOnWindowClose = value; - break; - - case GLUT_RENDERING_CONTEXT: - fgState.UseCurrentContext = - ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE; - break; - - case GLUT_DIRECT_RENDERING: - fgState.DirectContext = value; - break; - - case GLUT_WINDOW_CURSOR: - if( fgStructure.CurrentWindow != NULL ) - fgStructure.CurrentWindow->State.Cursor = value; - break; - - case GLUT_AUX: - fgState.AuxiliaryBufferNumber = value; - break; - - case GLUT_MULTISAMPLE: - fgState.SampleNumber = value; - break; - - default: - fgWarning( "glutSetOption(): missing enum handle %d", eWhat ); - break; - } -} - -#if TARGET_HOST_MS_WINDOWS -/* The following include file is available from SGI but is not standard: - * #include <GL/wglext.h> - * So we copy the necessary parts out of it to support the multisampling query - */ -#define WGL_SAMPLES_ARB 0x2042 -#endif - - -/* - * General settings query method - */ -int FGAPIENTRY glutGet( GLenum eWhat ) -{ -#if TARGET_HOST_MS_WINDOWS - int returnValue ; - GLboolean boolValue ; -#endif - int nsamples = 0; - switch (eWhat) - { - case GLUT_INIT_STATE: - return fgState.Initialised; - - case GLUT_ELAPSED_TIME: - return fgElapsedTime(); - } - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" ); - - /* XXX In chronological code add order. (WHY in that order?) */ switch( eWhat ) { - /* Following values are stored in fgState and fgDisplay global structures */ - case GLUT_SCREEN_WIDTH: return fgDisplay.ScreenWidth ; - case GLUT_SCREEN_HEIGHT: return fgDisplay.ScreenHeight ; - case GLUT_SCREEN_WIDTH_MM: return fgDisplay.ScreenWidthMM ; - case GLUT_SCREEN_HEIGHT_MM: return fgDisplay.ScreenHeightMM; - case GLUT_INIT_WINDOW_X: return fgState.Position.Use ? - fgState.Position.X : -1 ; - case GLUT_INIT_WINDOW_Y: return fgState.Position.Use ? - fgState.Position.Y : -1 ; - case GLUT_INIT_WINDOW_WIDTH: return fgState.Size.Use ? - fgState.Size.X : -1 ; - case GLUT_INIT_WINDOW_HEIGHT: return fgState.Size.Use ? - fgState.Size.Y : -1 ; - case GLUT_INIT_DISPLAY_MODE: return fgState.DisplayMode ; - case GLUT_INIT_MAJOR_VERSION: return fgState.MajorVersion ; - case GLUT_INIT_MINOR_VERSION: return fgState.MinorVersion ; - case GLUT_INIT_FLAGS: return fgState.ContextFlags ; - case GLUT_INIT_PROFILE: return fgState.ContextProfile ; - -#if TARGET_HOST_POSIX_X11 /* * The window/context specific queries are handled mostly by * fghGetConfig(). @@ -332,185 +218,117 @@ return fghGetConfig( GLX_VISUAL_ID ); -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_WINDOW_NUM_SAMPLES: - glGetIntegerv(WGL_SAMPLES_ARB, &nsamples); - return nsamples; - - /* Handle the OpenGL inquiries */ - case GLUT_WINDOW_RGBA: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_RGBA_MODE, &boolValue ); - returnValue = boolValue ? 1 : 0; + default: + fgWarning( "glutGet(): missing enum handle %d", eWhat ); + break; + } +} #endif - return returnValue; - case GLUT_WINDOW_DOUBLEBUFFER: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_DOUBLEBUFFER, &boolValue ); - returnValue = boolValue ? 1 : 0; -#endif - return returnValue; - case GLUT_WINDOW_STEREO: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_STEREO, &boolValue ); - returnValue = boolValue ? 1 : 0; -#endif - return returnValue; - case GLUT_WINDOW_RED_SIZE: - glGetIntegerv ( GL_RED_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_GREEN_SIZE: - glGetIntegerv ( GL_GREEN_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_BLUE_SIZE: - glGetIntegerv ( GL_BLUE_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_ALPHA_SIZE: - glGetIntegerv ( GL_ALPHA_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_ACCUM_RED_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_RED_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_GREEN_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_GREEN_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_BLUE_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_BLUE_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_ALPHA_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_ALPHA_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_DEPTH_SIZE: - glGetIntegerv ( GL_DEPTH_BITS, &returnValue ); - return returnValue; +/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - case GLUT_WINDOW_BUFFER_SIZE: - returnValue = 1 ; /* ????? */ - return returnValue; - case GLUT_WINDOW_STENCIL_SIZE: - returnValue = 0 ; /* ????? */ - return returnValue; +/* + * General settings assignment method + */ +void FGAPIENTRY glutSetOption( GLenum eWhat, int value ) +{ + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" ); - case GLUT_WINDOW_X: - case GLUT_WINDOW_Y: - case GLUT_WINDOW_WIDTH: - case GLUT_WINDOW_HEIGHT: + /* + * XXX In chronological code add order. (WHY in that order?) + */ + switch( eWhat ) { - /* - * There is considerable confusion about the "right thing to - * do" concerning window size and position. GLUT itself is - * not consistent between Windows and UNIX/X11; since - * platform independence is a virtue for "freeglut", we - * decided to break with GLUT's behaviour. - * - * Under UNIX/X11, it is apparently not possible to get the - * window border sizes in order to subtract them off the - * window's initial position until some time after the window - * has been created. Therefore we decided on the following - * behaviour, both under Windows and under UNIX/X11: - * - When you create a window with position (x,y) and size - * (w,h), the upper left hand corner of the outside of the - * window is at (x,y) and the size of the drawable area is - * (w,h). - * - When you query the size and position of the window--as - * is happening here for Windows--"freeglut" will return - * the size of the drawable area--the (w,h) that you - * specified when you created the window--and the coordinates - * of the upper left hand corner of the drawable - * area--which is NOT the (x,y) you specified. - */ + case GLUT_INIT_WINDOW_X: + fgState.Position.X = (GLint)value; + break; - RECT winRect; + case GLUT_INIT_WINDOW_Y: + fgState.Position.Y = (GLint)value; + break; - freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); + case GLUT_INIT_WINDOW_WIDTH: + fgState.Size.X = (GLint)value; + break; -#if defined(_WIN32_WCE) - GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); -#else - winRect = fghGetClientArea(fgStructure.CurrentWindow, FALSE); -#endif /* defined(_WIN32_WCE) */ + case GLUT_INIT_WINDOW_HEIGHT: + fgState.Size.Y = (GLint)value; + break; - switch( eWhat ) - { - case GLUT_WINDOW_X: return winRect.left ; - case GLUT_WINDOW_Y: return winRect.top ; - case GLUT_WINDOW_WIDTH: return winRect.right - winRect.left; - case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top; - } - } - break; + case GLUT_INIT_DISPLAY_MODE: + fgState.DisplayMode = (unsigned int)value; + break; - case GLUT_WINDOW_BORDER_WIDTH : - case GLUT_WINDOW_HEADER_HEIGHT : -#if defined(_WIN32_WCE) - return 0; -#else - { - DWORD windowStyle; + case GLUT_ACTION_ON_WINDOW_CLOSE: + fgState.ActionOnWindowClose = value; + break; - if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle) - windowStyle = GetWindowLong(fgStructure.CurrentWindow->Window.Handle, GWL_STYLE); - else - /* If no window, return sizes for a default window with title bar and border */ - windowStyle = WS_OVERLAPPEDWINDOW; - - switch( eWhat ) - { - case GLUT_WINDOW_BORDER_WIDTH: - { - int xBorderWidth, yBorderWidth; - fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth); - return xBorderWidth; - } - case GLUT_WINDOW_HEADER_HEIGHT: - /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */ - return (windowStyle & WS_MAXIMIZEBOX)? GetSystemMetrics( SM_CYCAPTION ) : 0; - } - } -#endif /* defined(_WIN32_WCE) */ + case GLUT_RENDERING_CONTEXT: + fgState.UseCurrentContext = + ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE; + break; - case GLUT_DISPLAY_MODE_POSSIBLE: -#if defined(_WIN32_WCE) - return 0; -#else - return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, - PFD_MAIN_PLANE ); -#endif /* defined(_WIN32_WCE) */ + case GLUT_DIRECT_RENDERING: + fgState.DirectContext = value; + break; - - case GLUT_WINDOW_FORMAT_ID: -#if !defined(_WIN32_WCE) + case GLUT_WINDOW_CURSOR: if( fgStructure.CurrentWindow != NULL ) - return GetPixelFormat( fgStructure.CurrentWindow->Window.Device ); -#endif /* defined(_WIN32_WCE) */ - return 0; + fgStructure.CurrentWindow->State.Cursor = value; + break; -#endif + case GLUT_AUX: + fgState.AuxiliaryBufferNumber = value; + break; + case GLUT_MULTISAMPLE: + fgState.SampleNumber = value; + break; + + default: + fgWarning( "glutSetOption(): missing enum handle %d", eWhat ); + break; + } +} + +/* + * General settings query method + */ +int FGAPIENTRY glutGet( GLenum eWhat ) +{ + switch (eWhat) + { + case GLUT_INIT_STATE: + return fgState.Initialised; + + case GLUT_ELAPSED_TIME: + return fgElapsedTime(); + } + + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" ); + + /* XXX In chronological code add order. (WHY in that order?) */ + switch( eWhat ) + { + /* Following values are stored in fgState and fgDisplay global structures */ + case GLUT_SCREEN_WIDTH: return fgDisplay.ScreenWidth ; + case GLUT_SCREEN_HEIGHT: return fgDisplay.ScreenHeight ; + case GLUT_SCREEN_WIDTH_MM: return fgDisplay.ScreenWidthMM ; + case GLUT_SCREEN_HEIGHT_MM: return fgDisplay.ScreenHeightMM; + case GLUT_INIT_WINDOW_X: return fgState.Position.Use ? + fgState.Position.X : -1 ; + case GLUT_INIT_WINDOW_Y: return fgState.Position.Use ? + fgState.Position.Y : -1 ; + case GLUT_INIT_WINDOW_WIDTH: return fgState.Size.Use ? + fgState.Size.X : -1 ; + case GLUT_INIT_WINDOW_HEIGHT: return fgState.Size.Use ? + fgState.Size.Y : -1 ; + case GLUT_INIT_DISPLAY_MODE: return fgState.DisplayMode ; + case GLUT_INIT_MAJOR_VERSION: return fgState.MajorVersion ; + case GLUT_INIT_MINOR_VERSION: return fgState.MinorVersion ; + case GLUT_INIT_FLAGS: return fgState.ContextFlags ; + case GLUT_INIT_PROFILE: return fgState.ContextProfile ; + /* The window structure queries */ case GLUT_WINDOW_PARENT: if( fgStructure.CurrentWindow == NULL ) return 0; @@ -555,7 +373,7 @@ return fgState.SampleNumber; default: - fgWarning( "glutGet(): missing enum handle %d", eWhat ); + return fgPlatformGlutGet ( eWhat ); break; } return -1; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 02:46:16 UTC (rev 996) +++ trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 04:06:48 UTC (rev 997) @@ -0,0 +1,231 @@ +/* + * freeglut_state_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sun Jan 22, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "freeglut_internal_mswin.h" + + + +/* The following include file is available from SGI but is not standard: + * #include <GL/wglext.h> + * So we copy the necessary parts out of it to support the multisampling query + */ +#define WGL_SAMPLES_ARB 0x2042 + + + +int fgPlatformGlutGet ( GLenum eWhat ) +{ + int returnValue ; + GLboolean boolValue ; + + int nsamples = 0; + + switch( eWhat ) + { + case GLUT_WINDOW_NUM_SAMPLES: + glGetIntegerv(WGL_SAMPLES_ARB, &nsamples); + return nsamples; + + /* Handle the OpenGL inquiries */ + case GLUT_WINDOW_RGBA: +#if defined(_WIN32_WCE) + boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ +#else + glGetBooleanv ( GL_RGBA_MODE, &boolValue ); + returnValue = boolValue ? 1 : 0; +#endif + return returnValue; + case GLUT_WINDOW_DOUBLEBUFFER: +#if defined(_WIN32_WCE) + boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ +#else + glGetBooleanv ( GL_DOUBLEBUFFER, &boolValue ); + returnValue = boolValue ? 1 : 0; +#endif + return returnValue; + case GLUT_WINDOW_STEREO: +#if defined(_WIN32_WCE) + boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ +#else + glGetBooleanv ( GL_STEREO, &boolValue ); + returnValue = boolValue ? 1 : 0; +#endif + return returnValue; + + case GLUT_WINDOW_RED_SIZE: + glGetIntegerv ( GL_RED_BITS, &returnValue ); + return returnValue; + case GLUT_WINDOW_GREEN_SIZE: + glGetIntegerv ( GL_GREEN_BITS, &returnValue ); + return returnValue; + case GLUT_WINDOW_BLUE_SIZE: + glGetIntegerv ( GL_BLUE_BITS, &returnValue ); + return returnValue; + case GLUT_WINDOW_ALPHA_SIZE: + glGetIntegerv ( GL_ALPHA_BITS, &returnValue ); + return returnValue; + case GLUT_WINDOW_ACCUM_RED_SIZE: +#if defined(_WIN32_WCE) + returnValue = 0; /* WinCE doesn't support this feature */ +#else + glGetIntegerv ( GL_ACCUM_RED_BITS, &returnValue ); +#endif + return returnValue; + case GLUT_WINDOW_ACCUM_GREEN_SIZE: +#if defined(_WIN32_WCE) + returnValue = 0; /* WinCE doesn't support this feature */ +#else + glGetIntegerv ( GL_ACCUM_GREEN_BITS, &returnValue ); +#endif + return returnValue; + case GLUT_WINDOW_ACCUM_BLUE_SIZE: +#if defined(_WIN32_WCE) + returnValue = 0; /* WinCE doesn't support this feature */ +#else + glGetIntegerv ( GL_ACCUM_BLUE_BITS, &returnValue ); +#endif + return returnValue; + case GLUT_WINDOW_ACCUM_ALPHA_SIZE: +#if defined(_WIN32_WCE) + returnValue = 0; /* WinCE doesn't support this feature */ +#else + glGetIntegerv ( GL_ACCUM_ALPHA_BITS, &returnValue ); +#endif + return returnValue; + case GLUT_WINDOW_DEPTH_SIZE: + glGetIntegerv ( GL_DEPTH_BITS, &returnValue ); + return returnValue; + + case GLUT_WINDOW_BUFFER_SIZE: + returnValue = 1 ; /* ????? */ + return returnValue; + case GLUT_WINDOW_STENCIL_SIZE: + returnValue = 0 ; /* ????? */ + return returnValue; + + case GLUT_WINDOW_X: + case GLUT_WINDOW_Y: + case GLUT_WINDOW_WIDTH: + case GLUT_WINDOW_HEIGHT: + { + /* + * There is considerable confusion about the "right thing to + * do" concerning window size and position. GLUT itself is + * not consistent between Windows and UNIX/X11; since + * platform independence is a virtue for "freeglut", we + * decided to break with GLUT's behaviour. + * + * Under UNIX/X11, it is apparently not possible to get the + * window border sizes in order to subtract them off the + * window's initial position until some time after the window + * has been created. Therefore we decided on the following + * behaviour, both under Windows and under UNIX/X11: + * - When you create a window with position (x,y) and size + * (w,h), the upper left hand corner of the outside of the + * window is at (x,y) and the size of the drawable area is + * (w,h). + * - When you query the size and position of the window--as + * is happening here for Windows--"freeglut" will return + * the size of the drawable area--the (w,h) that you + * specified when you created the window--and the coordinates + * of the upper left hand corner of the drawable + * area--which is NOT the (x,y) you specified. + */ + + RECT winRect; + + freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); + +#if defined(_WIN32_WCE) + GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); +#else + winRect = fghGetClientArea(fgStructure.CurrentWindow, FALSE); +#endif /* defined(_WIN32_WCE) */ + + switch( eWhat ) + { + case GLUT_WINDOW_X: return winRect.left ; + case GLUT_WINDOW_Y: return winRect.top ; + case GLUT_WINDOW_WIDTH: return winRect.right - winRect.left; + case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top; + } + } + break; + + case GLUT_WINDOW_BORDER_WIDTH : + case GLUT_WINDOW_HEADER_HEIGHT : +#if defined(_WIN32_WCE) + return 0; +#else + { + DWORD windowStyle; + + if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle) + windowStyle = GetWindowLong(fgStructure.CurrentWindow->Window.Handle, GWL_STYLE); + else + /* If no window, return sizes for a default window with title bar and border */ + windowStyle = WS_OVERLAPPEDWINDOW; + + switch( eWhat ) + { + case GLUT_WINDOW_BORDER_WIDTH: + { + int xBorderWidth, yBorderWidth; + fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth); + return xBorderWidth; + } + case GLUT_WINDOW_HEADER_HEIGHT: + /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */ + return (windowStyle & WS_MAXIMIZEBOX)? GetSystemMetrics( SM_CYCAPTION ) : 0; + } + } +#endif /* defined(_WIN32_WCE) */ + + case GLUT_DISPLAY_MODE_POSSIBLE: +#if defined(_WIN32_WCE) + return 0; +#else + return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, + PFD_MAIN_PLANE ); +#endif /* defined(_WIN32_WCE) */ + + + case GLUT_WINDOW_FORMAT_ID: +#if !defined(_WIN32_WCE) + if( fgStructure.CurrentWindow != NULL ) + return GetPixelFormat( fgStructure.CurrentWindow->Window.Device ); +#endif /* defined(_WIN32_WCE) */ + return 0; + + default: + fgWarning( "glutGet(): missing enum handle %d", eWhat ); + break; + } + + return -1; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 04:37:12
|
Revision: 998 http://freeglut.svn.sourceforge.net/freeglut/?rev=998&view=rev Author: fayjf Date: 2012-01-23 04:37:06 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Splitting the other "glutGet" Windows-specific code into its own function Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_state.c trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_state.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 04:06:48 UTC (rev 997) +++ trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 04:37:06 UTC (rev 998) @@ -42,6 +42,8 @@ */ extern int fgPlatformGlutGet ( GLenum eWhat ); +extern int fgPlatformGlutDeviceGet ( GLenum eWhat ); +extern int fgPlatformGlutLayerGet ( GLenum eWhat ); /* -- LOCAL DEFINITIONS ---------------------------------------------------- */ @@ -223,6 +225,92 @@ break; } } + + +static int fgPlatformGlutDeviceGet ( GLenum eWhat ) +{ + switch( eWhat ) + { + case GLUT_HAS_KEYBOARD: + /* + * X11 has a core keyboard by definition, although it can + * be present as a virtual/dummy keyboard. For now, there + * is no reliable way to tell if a real keyboard is present. + */ + return 1; + + /* X11 has a mouse by definition */ + case GLUT_HAS_MOUSE: + return 1 ; + + case GLUT_NUM_MOUSE_BUTTONS: + /* We should be able to pass NULL when the last argument is zero, + * but at least one X server has a bug where this causes a segfault. + * + * In XFree86/Xorg servers, a mouse wheel is seen as two buttons + * rather than an Axis; "freeglut_main.c" expects this when + * checking for a wheel event. + */ + { + unsigned char map; + int nbuttons = XGetPointerMapping(fgDisplay.Display, &map,0); + return nbuttons; + } + + default: + fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat ); + break; + } + + /* And now -- the failure. */ + return -1; +} + +int fgPlatformGlutLayerGet( GLenum eWhat ) +{ + /* + * This is easy as layers are not implemented ;-) + * + * XXX Can we merge the UNIX/X11 and WIN32 sections? Or + * XXX is overlay support planned? + */ + switch( eWhat ) + { + case GLUT_OVERLAY_POSSIBLE: + return 0; + + case GLUT_LAYER_IN_USE: + return GLUT_NORMAL; + + case GLUT_HAS_OVERLAY: + return 0; + + case GLUT_TRANSPARENT_INDEX: + /* + * Return just anything, which is always defined as zero + * + * XXX HUH? + */ + return 0; + + case GLUT_NORMAL_DAMAGED: + /* XXX Actually I do not know. Maybe. */ + return 0; + + case GLUT_OVERLAY_DAMAGED: + return -1; + + default: + fgWarning( "glutLayerGet(): missing enum handle %d", eWhat ); + break; + } + + /* And fail. That's good. Programs do love failing. */ + return -1; +} + + + #endif /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ @@ -389,61 +477,6 @@ /* XXX WARNING: we are mostly lying in this function. */ switch( eWhat ) { - case GLUT_HAS_KEYBOARD: - /* - * Win32 is assumed a keyboard, and this cannot be queried, - * except for WindowsCE. - * - * X11 has a core keyboard by definition, although it can - * be present as a virtual/dummy keyboard. For now, there - * is no reliable way to tell if a real keyboard is present. - */ -#if defined(_WIN32_CE) - return ( GetKeyboardStatus() & KBDI_KEYBOARD_PRESENT ) ? 1 : 0; -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib,"Kbdui.lib") -# endif - -#else - return 1; -#endif - -#if TARGET_HOST_POSIX_X11 - - /* X11 has a mouse by definition */ - case GLUT_HAS_MOUSE: - return 1 ; - - case GLUT_NUM_MOUSE_BUTTONS: - /* We should be able to pass NULL when the last argument is zero, - * but at least one X server has a bug where this causes a segfault. - * - * In XFree86/Xorg servers, a mouse wheel is seen as two buttons - * rather than an Axis; "freeglut_main.c" expects this when - * checking for a wheel event. - */ - { - unsigned char map; - int nbuttons = XGetPointerMapping(fgDisplay.Display, &map,0); - return nbuttons; - } - -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_HAS_MOUSE: - /* - * MS Windows can be booted without a mouse. - */ - return GetSystemMetrics( SM_MOUSEPRESENT ); - - case GLUT_NUM_MOUSE_BUTTONS: -# if defined(_WIN32_WCE) - return 1; -# else - return GetSystemMetrics( SM_CMOUSEBUTTONS ); -# endif -#endif - case GLUT_HAS_JOYSTICK: return fgJoystickDetect (); @@ -489,8 +522,7 @@ return fgState.KeyRepeat; default: - fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat ); - break; + return fgPlatformGlutDeviceGet ( eWhat ); } /* And now -- the failure. */ @@ -528,64 +560,8 @@ switch( eWhat ) { -#if TARGET_HOST_POSIX_X11 - - case GLUT_OVERLAY_POSSIBLE: - return 0; - - case GLUT_LAYER_IN_USE: - return GLUT_NORMAL; - - case GLUT_HAS_OVERLAY: - return 0; - - case GLUT_TRANSPARENT_INDEX: - /* - * Return just anything, which is always defined as zero - * - * XXX HUH? - */ - return 0; - - case GLUT_NORMAL_DAMAGED: - /* XXX Actually I do not know. Maybe. */ - return 0; - - case GLUT_OVERLAY_DAMAGED: - return -1; - -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_OVERLAY_POSSIBLE: -/* return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, - PFD_OVERLAY_PLANE ); */ - return 0 ; - - case GLUT_LAYER_IN_USE: - return GLUT_NORMAL; - - case GLUT_HAS_OVERLAY: - return 0; - - case GLUT_TRANSPARENT_INDEX: - /* - * Return just anything, which is always defined as zero - * - * XXX HUH? - */ - return 0; - - case GLUT_NORMAL_DAMAGED: - /* XXX Actually I do not know. Maybe. */ - return 0; - - case GLUT_OVERLAY_DAMAGED: - return -1; -#endif - default: - fgWarning( "glutLayerGet(): missing enum handle %d", eWhat ); - break; + return fgPlatformGlutLayerGet( eWhat ); } /* And fail. That's good. Programs do love failing. */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 04:06:48 UTC (rev 997) +++ trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 04:37:06 UTC (rev 998) @@ -229,3 +229,99 @@ return -1; } + + +int fgPlatformGlutDeviceGet ( GLenum eWhat ) +{ + switch( eWhat ) + { + case GLUT_HAS_KEYBOARD: + /* + * Win32 is assumed a keyboard, and this cannot be queried, + * except for WindowsCE. + * + * X11 has a core keyboard by definition, although it can + * be present as a virtual/dummy keyboard. For now, there + * is no reliable way to tell if a real keyboard is present. + */ +#if defined(_WIN32_CE) + return ( GetKeyboardStatus() & KBDI_KEYBOARD_PRESENT ) ? 1 : 0; +# if FREEGLUT_LIB_PRAGMAS +# pragma comment (lib,"Kbdui.lib") +# endif + +#else + return 1; +#endif + + case GLUT_HAS_MOUSE: + /* + * MS Windows can be booted without a mouse. + */ + return GetSystemMetrics( SM_MOUSEPRESENT ); + + case GLUT_NUM_MOUSE_BUTTONS: +# if defined(_WIN32_WCE) + return 1; +# else + return GetSystemMetrics( SM_CMOUSEBUTTONS ); +# endif + + default: + fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat ); + break; + } + + /* And now -- the failure. */ + return -1; +} + + +int fgPlatformGlutLayerGet( GLenum eWhat ) +{ + /* + * This is easy as layers are not implemented ;-) + * + * XXX Can we merge the UNIX/X11 and WIN32 sections? Or + * XXX is overlay support planned? + */ + switch( eWhat ) + { + + case GLUT_OVERLAY_POSSIBLE: +/* return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, + PFD_OVERLAY_PLANE ); */ + return 0 ; + + case GLUT_LAYER_IN_USE: + return GLUT_NORMAL; + + case GLUT_HAS_OVERLAY: + return 0; + + case GLUT_TRANSPARENT_INDEX: + /* + * Return just anything, which is always defined as zero + * + * XXX HUH? + */ + return 0; + + case GLUT_NORMAL_DAMAGED: + /* XXX Actually I do not know. Maybe. */ + return 0; + + case GLUT_OVERLAY_DAMAGED: + return -1; + + default: + fgWarning( "glutLayerGet(): missing enum handle %d", eWhat ); + break; + } + + /* And fail. That's good. Programs do love failing. */ + return -1; +} + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 04:42:37
|
Revision: 999 http://freeglut.svn.sourceforge.net/freeglut/?rev=999&view=rev Author: fayjf Date: 2012-01-23 04:42:31 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Splitting Windows-specific "freeglut_structure.c" code into its own file (there isn't any) Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_structure.c trunk/freeglut/freeglut/src/mswin/freeglut_structure_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_structure.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_structure.c 2012-01-23 04:37:06 UTC (rev 998) +++ trunk/freeglut/freeglut/src/Common/freeglut_structure.c 2012-01-23 04:42:31 UTC (rev 999) @@ -48,6 +48,8 @@ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ +extern void fgPlatformCreateWindow ( SFG_Window *window ); + static void fghClearCallBacks( SFG_Window *window ) { if( window ) @@ -58,6 +60,15 @@ } } +#if TARGET_HOST_POSIX_X11 +void fgPlatformCreateWindow ( SFG_Window *window ) +{ + window->Window.FBConfig = NULL; + + window->State.OldHeight = window->State.OldWidth = -1; +} +#endif + /* * This private function creates, opens and adds to the hierarchy * a freeglut window complete with OpenGL context and stuff... @@ -72,16 +83,12 @@ /* Have the window object created */ SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 ); -#if TARGET_HOST_UNIX_X11 - window->Window.FBConfig = NULL; -#endif + fgPlatformCreateWindow ( window ); + fghClearCallBacks( window ); /* Initialize the object properties */ window->ID = ++fgStructure.WindowID; -#if TARGET_HOST_POSIX_X11 - window->State.OldHeight = window->State.OldWidth = -1; -#endif fgListInit( &window->Children ); if( parent ) Modified: trunk/freeglut/freeglut/src/mswin/freeglut_structure_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_structure_mswin.c 2012-01-23 04:37:06 UTC (rev 998) +++ trunk/freeglut/freeglut/src/mswin/freeglut_structure_mswin.c 2012-01-23 04:42:31 UTC (rev 999) @@ -0,0 +1,34 @@ +/* + * freeglut_structure_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sun Jan 22, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "freeglut_internal_mswin.h" + + +void fgPlatformCreateWindow ( SFG_Window *window ) +{ +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 05:01:44
|
Revision: 1000 http://freeglut.svn.sourceforge.net/freeglut/?rev=1000&view=rev Author: fayjf Date: 2012-01-23 05:01:37 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Rationalizing the names of the platform-specific functions so that they begin with "fgPlatform" Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_cursor.c trunk/freeglut/freeglut/src/Common/freeglut_ext.c trunk/freeglut/freeglut/src/Common/freeglut_gamemode.c trunk/freeglut/freeglut/src/Common/freeglut_init.c trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/Common/freeglut_main.c trunk/freeglut/freeglut/src/Common/freeglut_menu.c trunk/freeglut/freeglut/src/Common/freeglut_xinput.c trunk/freeglut/freeglut/src/mswin/freeglut_cursor_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_ext_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_gamemode_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_cursor.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_cursor.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_cursor.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -39,8 +39,8 @@ /* -- PRIVATE FUNCTIONS --------------------------------------------------- */ -extern void fghSetCursor ( SFG_Window *window, int cursorID ); -extern void fghWarpPointer ( int x, int y ); +extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID ); +extern void fgPlatformWarpPointer ( int x, int y ); #if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS #include <X11/cursorfont.h> @@ -104,7 +104,7 @@ { XC_bottom_left_corner, None } /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */ }; -static void fghSetCursor ( SFG_Window *window, int cursorID ) +static void fgPlatformSetCursor ( SFG_Window *window, int cursorID ) { Cursor cursor; /* @@ -150,7 +150,7 @@ } -static void fghWarpPointer ( int x, int y ) +static void fgPlatformWarpPointer ( int x, int y ) { XWarpPointer( fgDisplay.Display, @@ -168,7 +168,7 @@ /* -- INTERNAL FUNCTIONS ---------------------------------------------------- */ void fgSetCursor ( SFG_Window *window, int cursorID ) { - fghSetCursor ( window, cursorID ); + fgPlatformSetCursor ( window, cursorID ); } @@ -182,7 +182,7 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" ); - fghSetCursor ( fgStructure.CurrentWindow, cursorID ); + fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID ); fgStructure.CurrentWindow->State.Cursor = cursorID; } @@ -194,7 +194,7 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" ); - fghWarpPointer ( x, y ); + fgPlatformWarpPointer ( x, y ); } /*** END OF FILE ***/ Modified: trunk/freeglut/freeglut/src/Common/freeglut_ext.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_ext.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_ext.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -30,7 +30,7 @@ #include "freeglut_internal.h" extern SFG_Proc fghGetProcAddress( const char *procName ); -extern GLUTproc fghGetPlatformSpecificGLUTProcAddress( const char *procName ); +extern GLUTproc fgPlatformGlutGetProcAddress( const char *procName ); static GLUTproc fghGetGLUTProcAddress( const char* procName ) { @@ -223,6 +223,12 @@ } +static GLUTproc fgPlatformGlutGetProcAddress( const char* procName ) +{ + return NULL; +} + + SFG_Proc fghGetProcAddress( const char *procName ) { #if defined( GLX_ARB_get_proc_address ) @@ -245,7 +251,7 @@ /* Some GLUT functions are platform-specific: */ if ( !p ) - p = fghGetPlatformSpecificGLUTProcAddress( procName ); + p = fgPlatformGlutGetProcAddress( procName ); return ( p != NULL ) ? p : fghGetProcAddress( procName ); } Modified: trunk/freeglut/freeglut/src/Common/freeglut_gamemode.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_gamemode.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_gamemode.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -39,9 +39,9 @@ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ -extern void fghRememberState( void ); -extern void fghRestoreState( void ); -extern GLboolean fghChangeDisplayMode( GLboolean haveToTest ); +extern void fgPlatformRememberState( void ); +extern void fgPlatformRestoreState( void ); +extern GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest ); #if TARGET_HOST_POSIX_X11 @@ -163,7 +163,7 @@ * Remembers the current visual settings, so that * we can change them and restore later... */ -static void fghRememberState( void ) +static void fgPlatformRememberState( void ) { int event_base, error_base; @@ -248,7 +248,7 @@ /* * Restores the previously remembered visual settings */ -static void fghRestoreState( void ) +static void fgPlatformRestoreState( void ) { /* Restore the remembered pointer position: */ XWarpPointer( @@ -398,7 +398,7 @@ /* * Changes the current display mode to match user's settings */ -static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) +static GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest ) { GLboolean success = GL_FALSE; /* first try to use XRandR, then fallback to XF86VidMode */ @@ -532,7 +532,7 @@ /* All values not specified are now set to -1, which means those * aspects of the current display mode are not changed in - * fghChangeDisplayMode() above. + * fgPlatformChangeDisplayMode() above. */ fgState.GameModeSize.X = width; fgState.GameModeSize.Y = height; @@ -552,9 +552,9 @@ if( fgStructure.GameModeWindow ) fgAddToWindowDestroyList( fgStructure.GameModeWindow ); else - fghRememberState( ); + fgPlatformRememberState( ); - if( ! fghChangeDisplayMode( GL_FALSE ) ) + if( ! fgPlatformChangeDisplayMode( GL_FALSE ) ) { fgWarning( "failed to change screen settings" ); return 0; @@ -680,7 +680,7 @@ #endif - fghRestoreState(); + fgPlatformRestoreState(); } /* @@ -696,7 +696,7 @@ return !!fgStructure.GameModeWindow; case GLUT_GAME_MODE_POSSIBLE: - return fghChangeDisplayMode( GL_TRUE ); + return fgPlatformChangeDisplayMode( GL_TRUE ); case GLUT_GAME_MODE_WIDTH: return fgState.GameModeSize.X; Modified: trunk/freeglut/freeglut/src/Common/freeglut_init.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -100,9 +100,9 @@ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ -extern void fghInitialize( const char* displayName ); -extern void fghDeinitialiseInputDevices ( void ); -extern void fghCloseDisplay ( void ); +extern void fgPlatformInitialize( const char* displayName ); +extern void fgPlatformDeinitialiseInputDevices ( void ); +extern void fgPlatformCloseDisplay ( void ); #if TARGET_HOST_POSIX_X11 @@ -246,7 +246,7 @@ /* * A call to this function should initialize all the display stuff... */ -static void fghInitialize( const char* displayName ) +static void fgPlatformInitialize( const char* displayName ) { fgDisplay.Display = XOpenDisplay( displayName ); @@ -437,7 +437,7 @@ #if TARGET_HOST_POSIX_X11 -static void fghDeinitialiseInputDevices ( void ) +static void fgPlatformDeinitialiseInputDevices ( void ) { fghCloseInputDevices (); @@ -446,7 +446,7 @@ } -static void fghCloseDisplay ( void ) +static void fgPlatformCloseDisplay ( void ) { /* * Make sure all X-client data we have created will be destroyed on @@ -506,7 +506,7 @@ free( timer ); } - fghDeinitialiseInputDevices (); + fgPlatformDeinitialiseInputDevices (); fgState.MouseWheelTicks = 0; @@ -560,7 +560,7 @@ fgState.ProgramName = NULL; } - fghCloseDisplay (); + fgPlatformCloseDisplay (); fgState.Initialised = GL_FALSE; } @@ -617,7 +617,7 @@ * in the program arguments, we will use the DISPLAY environment * variable for opening the X display (see code above): */ - fghInitialize( displayName ); + fgPlatformInitialize( displayName ); /* * Geometry parsing deffered until here because we may need the screen Modified: trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_input_devices.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -99,7 +99,7 @@ extern int serial_putchar ( SERIALPORT *port, unsigned char ch ); extern void serial_flush ( SERIALPORT *port ); -extern void fghRegisterDialDevice ( const char *dial_device ); +extern void fgPlatformRegisterDialDevice ( const char *dial_device ); static void send_dial_event(int dial, int value); static void poll_dials(int id); @@ -128,7 +128,7 @@ * Try initializing the input device(s) */ #if TARGET_HOST_POSIX_X11 -static void fghRegisterDialDevice ( const char *dial_device ) +static void fgPlatformRegisterDialDevice ( const char *dial_device ) { } #endif @@ -139,7 +139,7 @@ { const char *dial_device=NULL; dial_device = getenv ( "GLUT_DIALS_SERIAL" ); - fghRegisterDialDevice ( dial_device ); + fgPlatformRegisterDialDevice ( dial_device ); if ( !dial_device ) return; if ( !( dialbox_port = serial_open ( dial_device ) ) ) return; Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-23 05:01:37 UTC (rev 1000) @@ -859,7 +859,7 @@ /* The window procedure for Win32 events handling */ #if TARGET_HOST_MS_WINDOWS -LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, +LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); void fgNewWGLCreateContext( SFG_Window* window ); GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, Modified: trunk/freeglut/freeglut/src/Common/freeglut_main.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -77,11 +77,11 @@ static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF; #endif -extern void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ); -extern void fghcbPlatformDisplayWindow ( SFG_Window *window ); -extern void fghPlatformSleepForEvents( long msec ); -extern void fghProcessSingleEvent ( void ); -extern void fghMainLoopPreliminaryWork ( void ); +extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ); +extern void fgPlatformDisplayWindow ( SFG_Window *window ); +extern void fgPlatformSleepForEvents( long msec ); +extern void fgPlatformProcessSingleEvent ( void ); +extern void fgPlatformMainLoopPreliminaryWork ( void ); /* @@ -103,7 +103,7 @@ * match the new window size. */ #if TARGET_HOST_POSIX_X11 -static void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ) +static void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ) { XResizeWindow( fgDisplay.Display, window->Window.Handle, width, height ); @@ -117,7 +117,7 @@ freeglut_return_if_fail( window != NULL ); - fghPlatformReshapeWindow ( window, width, height ); + fgPlatformReshapeWindow ( window, width, height ); if( FETCH_WCB( *window, Reshape ) ) INVOKE_WCB( *window, Reshape, ( width, height ) ); @@ -177,7 +177,7 @@ * A static helper function to execute display callback for a window */ #if TARGET_HOST_POSIX_X11 -static void fghcbPlatformDisplayWindow ( SFG_Window *window ) +static void fgPlatformDisplayWindow ( SFG_Window *window ) { fghRedrawWindow ( window ) ; } @@ -190,7 +190,7 @@ window->State.Visible ) { window->State.Redisplay = GL_FALSE; - fghcbPlatformDisplayWindow ( window ); + fgPlatformDisplayWindow ( window ); } fgEnumSubWindows( window, fghcbDisplayWindow, enumerator ); @@ -423,7 +423,7 @@ */ #if TARGET_HOST_POSIX_X11 -static void fghPlatformSleepForEvents( long msec ) +static void fgPlatformSleepForEvents( long msec ) { /* * Possibly due to aggressive use of XFlush() and friends, @@ -469,14 +469,14 @@ if( fghHaveJoystick( ) && ( msec > 10 ) ) msec = 10; - fghPlatformSleepForEvents ( msec ); + fgPlatformSleepForEvents ( msec ); } #if TARGET_HOST_POSIX_X11 /* * Returns GLUT modifier mask for the state field of an X11 event. */ -int fghGetModifiers( int state ) +int fgPlatformGetModifiers( int state ) { int ret = 0; @@ -933,7 +933,7 @@ } -void fghProcessSingleEvent ( void ) +void fgPlatformProcessSingleEvent ( void ) { SFG_Window* window; XEvent event; @@ -1147,7 +1147,7 @@ * XXX track ButtonPress/ButtonRelease events in our own * XXX bit-mask? */ - fgState.Modifiers = fghGetModifiers( event.xmotion.state ); + fgState.Modifiers = fgPlatformGetModifiers( event.xmotion.state ); if ( event.xmotion.state & ( Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask ) ) { INVOKE_WCB( *window, Motion, ( event.xmotion.x, event.xmotion.y ) ); @@ -1201,7 +1201,7 @@ ! FETCH_WCB( *window, MouseWheel ) ) break; - fgState.Modifiers = fghGetModifiers( event.xbutton.state ); + fgState.Modifiers = fgPlatformGetModifiers( event.xbutton.state ); /* Finally execute the mouse or mouse wheel callback */ if( ( button < glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS ) ) || ( ! FETCH_WCB( *window, MouseWheel ) ) ) @@ -1316,7 +1316,7 @@ if( keyboard_cb ) { fgSetWindow( window ); - fgState.Modifiers = fghGetModifiers( event.xkey.state ); + fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state ); keyboard_cb( asciiCode[ 0 ], event.xkey.x, event.xkey.y ); @@ -1385,7 +1385,7 @@ if( special_cb && (special != -1) ) { fgSetWindow( window ); - fgState.Modifiers = fghGetModifiers( event.xkey.state ); + fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state ); special_cb( special, event.xkey.x, event.xkey.y ); fgState.Modifiers = INVALID_MODIFIERS; } @@ -1412,7 +1412,7 @@ } -static void fghMainLoopPreliminaryWork ( void ) +static void fgPlatformMainLoopPreliminaryWork ( void ) { } #endif @@ -1424,7 +1424,7 @@ */ void FGAPIENTRY glutMainLoopEvent( void ) { - fghProcessSingleEvent (); + fgPlatformProcessSingleEvent (); if( fgState.Timers.First ) fghCheckTimers( ); @@ -1444,7 +1444,7 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" ); - fghMainLoopPreliminaryWork (); + fgPlatformMainLoopPreliminaryWork (); fgState.ExecState = GLUT_EXEC_STATE_RUNNING ; while( fgState.ExecState == GLUT_EXEC_STATE_RUNNING ) Modified: trunk/freeglut/freeglut/src/Common/freeglut_menu.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -85,7 +85,7 @@ #endif -extern GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ); +extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ); /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ @@ -143,7 +143,7 @@ * Private function to get the virtual maximum screen extent */ #if TARGET_HOST_POSIX_X11 -static GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) +static GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) { int wx, wy; Window w; @@ -163,7 +163,7 @@ static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y ) { if( fgStructure.GameModeWindow ) - fghGetGameModeVMaxExtent ( window, x, y ); + fgPlatformGetGameModeVMaxExtent ( window, x, y ); else { *x = fgDisplay.ScreenWidth; Modified: trunk/freeglut/freeglut/src/Common/freeglut_xinput.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_xinput.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/Common/freeglut_xinput.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -14,7 +14,7 @@ #include <X11/extensions/XInput2.h> /* import function from freeglut_main.c */ -int fghGetModifiers( int state ); +extern int fgPlatformGetModifiers( int state ); /* extension opcode for XInput */ int xi_opcode = -1; @@ -160,7 +160,7 @@ case XI_Enter: case XI_Leave: - fgState.Modifiers = fghGetModifiers( ((XIEnterEvent*)event)->mods.base ); + fgState.Modifiers = fgPlatformGetModifiers( ((XIEnterEvent*)event)->mods.base ); INVOKE_WCB( *window, MultiEntry, ( event->deviceid, (event->evtype == XI_Enter ? GLUT_ENTERED : GLUT_LEFT) @@ -172,7 +172,7 @@ case XI_ButtonPress: case XI_ButtonRelease: - fgState.Modifiers = fghGetModifiers( event->mods.base ); + fgState.Modifiers = fgPlatformGetModifiers( event->mods.base ); INVOKE_WCB( *window, MultiButton, ( event->deviceid, event->event_x, @@ -189,7 +189,7 @@ break; case XI_Motion: - fgState.Modifiers = fghGetModifiers( event->mods.base ); + fgState.Modifiers = fgPlatformGetModifiers( event->mods.base ); for (i = 0; i < event->buttons.mask_len; i++) if (event->buttons.mask[i]) button = 1; if (button) { INVOKE_WCB( *window, MultiMotion, ( event->deviceid, event->event_x, event->event_y ) ); Modified: trunk/freeglut/freeglut/src/mswin/freeglut_cursor_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_cursor_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_cursor_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -30,7 +30,7 @@ -void fghSetCursor ( SFG_Window *window, int cursorID ) +void fgPlatformSetCursor ( SFG_Window *window, int cursorID ) { /* * Joe Krahn is re-writing the following code. @@ -101,7 +101,7 @@ } -void fghWarpPointer ( int x, int y ) +void fgPlatformWarpPointer ( int x, int y ) { POINT coords; coords.x = x; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_ext_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_ext_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_ext_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -28,7 +28,7 @@ #include <GL/freeglut.h> #include "freeglut_internal_mswin.h" -GLUTproc fghGetPlatformSpecificGLUTProcAddress( const char* procName ) +GLUTproc fgPlatformGlutGetProcAddress( const char* procName ) { #if !defined(_WIN32_WCE) /* optimization: quick initial check */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_gamemode_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_gamemode_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_gamemode_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -32,7 +32,7 @@ * Remembers the current visual settings, so that * we can change them and restore later... */ -void fghRememberState( void ) +void fgPlatformRememberState( void ) { /* DEVMODE devMode; */ @@ -53,7 +53,7 @@ /* * Restores the previously remembered visual settings */ -void fghRestoreState( void ) +void fgPlatformRestoreState( void ) { /* Restore the previously remembered desktop display settings */ ChangeDisplaySettingsEx( fgDisplay.DisplayName,&fgDisplay.DisplayMode, 0,0,0 ); @@ -66,7 +66,7 @@ /* * Changes the current display mode to match user's settings */ -GLboolean fghChangeDisplayMode( GLboolean haveToTest ) +GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest ) { GLboolean success = GL_FALSE; DEVMODE devMode; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -32,7 +32,7 @@ /* * A call to this function should initialize all the display stuff... */ -void fghInitialize( const char* displayName ) +void fgPlatformInitialize( const char* displayName ) { WNDCLASS wc; ATOM atom; @@ -54,7 +54,7 @@ * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the * XXX future? Dead-end idea? */ - wc.lpfnWndProc = fgWindowProc; + wc.lpfnWndProc = fgPlatformWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = fgDisplay.Instance; @@ -75,7 +75,7 @@ /* Register the window class */ atom = RegisterClass( &wc ); - FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fghInitialize" ); + FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fgPlatformInitialize" ); } /* The screen dimensions can be obtained via GetSystemMetrics() calls */ @@ -104,7 +104,7 @@ DeleteDC(context); } else - fgWarning("fghInitialize: " + fgWarning("fgPlatformInitialize: " "CreateDC failed, Screen size info may be incorrect\n" "This is quite likely caused by a bad '-display' parameter"); @@ -131,7 +131,7 @@ /* Platform-Specific Deinitialization Functions: */ extern void fghCloseInputDevices ( void ); -void fghDeinitialiseInputDevices ( void ) +void fgPlatformDeinitialiseInputDevices ( void ) { #if !defined(_WIN32_WCE) fghCloseInputDevices (); @@ -140,7 +140,7 @@ fgState.InputDevsInitialised = GL_FALSE; } -void fghCloseDisplay ( void ) +void fgPlatformCloseDisplay ( void ) { if( fgDisplay.DisplayName ) { Modified: trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_input_devices_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -45,7 +45,7 @@ void serial_flush ( SERIALPORT *port ); -void fghRegisterDialDevice ( const char *dial_device ) +void fgPlatformRegisterDialDevice ( const char *dial_device ) { if (!dial_device){ static char devname[256]; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -32,7 +32,7 @@ extern void fghRedrawWindow ( SFG_Window *window ); -void fghPlatformReshapeWindow ( SFG_Window *window, int width, int height ) +void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ) { RECT windowRect; @@ -80,7 +80,7 @@ } -void fghcbPlatformDisplayWindow ( SFG_Window *window ) +void fgPlatformDisplayWindow ( SFG_Window *window ) { RedrawWindow( window->Window.Handle, NULL, NULL, @@ -89,13 +89,13 @@ } -void fghPlatformSleepForEvents( long msec ) +void fgPlatformSleepForEvents( long msec ) { MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT ); } -void fghProcessSingleEvent ( void ) +void fgPlatformProcessSingleEvent ( void ) { MSG stMsg; @@ -123,7 +123,7 @@ -void fghMainLoopPreliminaryWork ( void ) +void fgPlatformMainLoopPreliminaryWork ( void ) { SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ; @@ -154,7 +154,7 @@ /* * Determine a GLUT modifer mask based on MS-WINDOWS system info. */ -static int fghGetModifiers (void) +static int fgPlatformGetModifiers (void) { return ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || @@ -168,8 +168,8 @@ /* * The window procedure for handling Win32 events */ -LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, - LPARAM lParam ) +LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, + LPARAM lParam ) { static unsigned char lControl = 0, rControl = 0, lShift = 0, rShift = 0, lAlt = 0, rAlt = 0; @@ -307,7 +307,7 @@ /* The window structure is passed as the creation structure parameter... */ window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams); FREEGLUT_INTERNAL_ERROR_EXIT ( ( window != NULL ), "Cannot create window", - "fgWindowProc" ); + "fgPlatformWindowProc" ); window->Window.Handle = hWnd; window->Window.Device = GetDC( hWnd ); @@ -497,7 +497,7 @@ } SetFocus(window->Window.Handle); - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); if( ( wParam & MK_LBUTTON ) || ( wParam & MK_MBUTTON ) || @@ -607,7 +607,7 @@ break; fgSetWindow( window ); - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); INVOKE_WCB( *window, Mouse, @@ -641,7 +641,7 @@ break; fgSetWindow( window ); - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); /* * XXX Should use WHEEL_DELTA instead of 120 @@ -702,7 +702,7 @@ * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); @@ -792,7 +792,7 @@ * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); @@ -877,7 +877,7 @@ if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) ) break; - fgState.Modifiers = fghGetModifiers( ); + fgState.Modifiers = fgPlatformGetModifiers( ); INVOKE_WCB( *window, Keyboard, ( (char)wParam, window->State.MouseX, window->State.MouseY ) Modified: trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-23 04:42:31 UTC (rev 999) +++ trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) @@ -29,7 +29,7 @@ #include "freeglut_internal_mswin.h" -GLvoid fghGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) +GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ) { *x = glutGet ( GLUT_SCREEN_WIDTH ); *y = glutGet ( GLUT_SCREEN_HEIGHT ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 05:07:04
|
Revision: 1001 http://freeglut.svn.sourceforge.net/freeglut/?rev=1001&view=rev Author: fayjf Date: 2012-01-23 05:06:58 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Moving some function prototypes into the source files where they are found and out of the "freeglut_internal.h" file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/Common/freeglut_state.c trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-23 05:01:37 UTC (rev 1000) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-23 05:06:58 UTC (rev 1001) @@ -852,20 +852,6 @@ void fgCreateStructure( void ); void fgDestroyStructure( void ); -/* A helper function to check if a display mode is possible to use */ -#if TARGET_HOST_POSIX_X11 -GLXFBConfig* fgChooseFBConfig( int* numcfgs ); -#endif - -/* The window procedure for Win32 events handling */ -#if TARGET_HOST_MS_WINDOWS -LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, - WPARAM wParam, LPARAM lParam ); -void fgNewWGLCreateContext( SFG_Window* window ); -GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, - unsigned char layer_type ); -#endif - /* * Window creation, opening, closing and destruction. * Also CallBack clearing/initialization. Modified: trunk/freeglut/freeglut/src/Common/freeglut_state.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 05:01:37 UTC (rev 1000) +++ trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-23 05:06:58 UTC (rev 1001) @@ -45,6 +45,12 @@ extern int fgPlatformGlutDeviceGet ( GLenum eWhat ); extern int fgPlatformGlutLayerGet ( GLenum eWhat ); +/* A helper function to check if a display mode is possible to use */ +#if TARGET_HOST_POSIX_X11 +GLXFBConfig* fgChooseFBConfig( int* numcfgs ); +#endif + + /* -- LOCAL DEFINITIONS ---------------------------------------------------- */ /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) +++ trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-23 05:06:58 UTC (rev 1001) @@ -29,6 +29,11 @@ #include "freeglut_internal_mswin.h" + +extern LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, + WPARAM wParam, LPARAM lParam ); + + /* * A call to this function should initialize all the display stuff... */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-23 05:06:58 UTC (rev 1001) @@ -31,7 +31,12 @@ extern void fghRedrawWindow ( SFG_Window *window ); +extern void fgNewWGLCreateContext( SFG_Window* window ); +extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, + unsigned char layer_type ); + + void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ) { RECT windowRect; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 05:01:37 UTC (rev 1000) +++ trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-23 05:06:58 UTC (rev 1001) @@ -29,7 +29,10 @@ #include "freeglut_internal_mswin.h" +extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, + unsigned char layer_type ); + /* The following include file is available from SGI but is not standard: * #include <GL/wglext.h> * So we copy the necessary parts out of it to support the multisampling query This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-23 05:44:25
|
Revision: 1003 http://freeglut.svn.sourceforge.net/freeglut/?rev=1003&view=rev Author: fayjf Date: 2012-01-23 05:44:18 +0000 (Mon, 23 Jan 2012) Log Message: ----------- Splitting the rest of the Windows-specific "freeglut_window.c" functions into their own file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_window.c trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_window.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-23 05:24:34 UTC (rev 1002) +++ trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-23 05:44:18 UTC (rev 1003) @@ -128,7 +128,19 @@ GLboolean sizeUse, int w, int h, GLboolean gameMode, GLboolean isSubWindow ); extern void fgPlatformCloseWindow( SFG_Window* window ); +extern void fgPlatformGlutShowWindow( void ); +extern void fgPlatformGlutHideWindow( void ); +extern void fgPlatformGlutIconifyWindow( void ); +extern void fgPlatformGlutSetWindowTitle( const char* title ); +extern void fgPlatformGlutSetIconTitle( const char* title ); +extern void fgPlatformGlutPositionWindow( int x, int y ); +extern void fgPlatformGlutPushWindow( void ); +extern void fgPlatformGlutPopWindow( void ); +extern void fgPlatformGlutFullScreen( SFG_Window *win ); +extern void fgPlatformGlutLeaveFullScreen( SFG_Window *win ); +extern void fgPlatformGlutFullScreenToggle( SFG_Window *win ); + /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ int fghIsLegacyContextVersionRequested( void ) @@ -751,6 +763,154 @@ /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */ } + +static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg) +{ + Window window = (Window)arg; + return (event->type == MapNotify) && (event->xmap.window == window); +} + + + + +/* + * This function makes the current window visible + */ +void fgPlatformGlutShowWindow( void ) +{ + XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * This function hides the current window + */ +void fgPlatformGlutHideWindow( void ) +{ + if( fgStructure.CurrentWindow->Parent == NULL ) + XWithdrawWindow( fgDisplay.Display, + fgStructure.CurrentWindow->Window.Handle, + fgDisplay.Screen ); + else + XUnmapWindow( fgDisplay.Display, + fgStructure.CurrentWindow->Window.Handle ); + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * Iconify the current window (top-level windows only) + */ +void fgPlatformGlutIconifyWindow( void ) +{ + XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, + fgDisplay.Screen ); + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * Set the current window's title + */ +void fgPlatformGlutSetWindowTitle( const char* title ) +{ + XTextProperty text; + + text.value = (unsigned char *) title; + text.encoding = XA_STRING; + text.format = 8; + text.nitems = strlen( title ); + + XSetWMName( + fgDisplay.Display, + fgStructure.CurrentWindow->Window.Handle, + &text + ); + + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * Set the current window's iconified title + */ +void fgPlatformGlutSetIconTitle( const char* title ) +{ + XTextProperty text; + + text.value = (unsigned char *) title; + text.encoding = XA_STRING; + text.format = 8; + text.nitems = strlen( title ); + + XSetWMIconName( + fgDisplay.Display, + fgStructure.CurrentWindow->Window.Handle, + &text + ); + + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * Change the current window's position + */ +void fgPlatformGlutPositionWindow( int x, int y ) +{ + XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, + x, y ); + XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ +} + +/* + * Lowers the current window (by Z order change) + */ +void fgPlatformGlutPushWindow( void ) +{ + XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); +} + +/* + * Raises the current window (by Z order change) + */ +void fgPlatformGlutPopWindow( void ) +{ + XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); +} + +/* + * Resize the current window so that it fits the whole screen + */ +void fgPlatformGlutFullScreen( SFG_Window *win ) +{ + if(!glutGet(GLUT_FULL_SCREEN)) { + if(fghToggleFullscreen() != -1) { + win->State.IsFullscreen = GL_TRUE; + } + } +} + +/* + * If we are fullscreen, resize the current window back to its original size + */ +void fgPlatformGlutLeaveFullScreen( SFG_Window *win ) +{ + if(glutGet(GLUT_FULL_SCREEN)) { + if(fghToggleFullscreen() != -1) { + win->State.IsFullscreen = GL_FALSE; + } + } +} + +/* + * Toggle the window's full screen state. + */ +void fgPlatformGlutFullScreenToggle( SFG_Window *win ) +{ + if(fghToggleFullscreen() != -1) { + win->State.IsFullscreen = !win->State.IsFullscreen; + } +} + + + #endif /* TARGET_HOST_POSIX_X11 */ @@ -766,13 +926,6 @@ } -#if TARGET_HOST_POSIX_X11 -static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg) -{ - Window window = (Window)arg; - return (event->type == MapNotify) && (event->xmap.window == window); -} -#endif /* @@ -955,17 +1108,8 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" ); -#if TARGET_HOST_POSIX_X11 + fgPlatformGlutShowWindow (); - XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW ); - -#endif - fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; } @@ -977,23 +1121,8 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" ); -#if TARGET_HOST_POSIX_X11 + fgPlatformGlutHideWindow (); - if( fgStructure.CurrentWindow->Parent == NULL ) - XWithdrawWindow( fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - fgDisplay.Screen ); - else - XUnmapWindow( fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE ); - -#endif - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; } @@ -1006,18 +1135,9 @@ FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" ); fgStructure.CurrentWindow->State.Visible = GL_FALSE; -#if TARGET_HOST_POSIX_X11 - XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, - fgDisplay.Screen ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ + fgPlatformGlutIconifyWindow (); -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE ); - -#endif - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; } @@ -1030,35 +1150,7 @@ FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" ); if( ! fgStructure.CurrentWindow->Parent ) { -#if TARGET_HOST_POSIX_X11 - - XTextProperty text; - - text.value = (unsigned char *) title; - text.encoding = XA_STRING; - text.format = 8; - text.nitems = strlen( title ); - - XSetWMName( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &text - ); - - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS -# ifdef _WIN32_WCE - { - wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); - free(wstr); - } -# else - SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); -# endif - -#endif + fgPlatformGlutSetWindowTitle ( title ); } } @@ -1072,35 +1164,7 @@ if( ! fgStructure.CurrentWindow->Parent ) { -#if TARGET_HOST_POSIX_X11 - - XTextProperty text; - - text.value = (unsigned char *) title; - text.encoding = XA_STRING; - text.format = 8; - text.nitems = strlen( title ); - - XSetWMIconName( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &text - ); - - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS -# ifdef _WIN32_WCE - { - wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); - free(wstr); - } -# else - SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); -# endif - -#endif + fgPlatformGlutSetIconTitle ( title ); } } @@ -1137,30 +1201,7 @@ glutLeaveFullScreen(); } -#if TARGET_HOST_POSIX_X11 - - XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, - x, y ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - { - RECT winRect; - - /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ - GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); - MoveWindow( - fgStructure.CurrentWindow->Window.Handle, - x, - y, - winRect.right - winRect.left, - winRect.bottom - winRect.top, - TRUE - ); - } - -#endif + fgPlatformGlutPositionWindow ( x, y ); } /* @@ -1171,20 +1212,7 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" ); -#if TARGET_HOST_POSIX_X11 - - XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - -#elif TARGET_HOST_MS_WINDOWS - - SetWindowPos( - fgStructure.CurrentWindow->Window.Handle, - HWND_BOTTOM, - 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE - ); - -#endif + fgPlatformGlutPushWindow (); } /* @@ -1195,20 +1223,7 @@ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" ); -#if TARGET_HOST_POSIX_X11 - - XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - -#elif TARGET_HOST_MS_WINDOWS - - SetWindowPos( - fgStructure.CurrentWindow->Window.Handle, - HWND_TOP, - 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE - ); - -#endif + fgPlatformGlutPopWindow (); } /* @@ -1238,91 +1253,7 @@ return; } -#if TARGET_HOST_POSIX_X11 - if(!glutGet(GLUT_FULL_SCREEN)) { - if(fghToggleFullscreen() != -1) { - win->State.IsFullscreen = GL_TRUE; - } - } - -#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: what about WinCE */ - - if (glutGet(GLUT_FULL_SCREEN)) - { - /* Leave full screen state before entering fullscreen again (resizing?) */ - glutLeaveFullScreen(); - } - - { -#if(WINVER >= 0x0500) /* Windows 2000 or later */ - DWORD s; - RECT rect; - HMONITOR hMonitor; - MONITORINFO mi; - - /* For fullscreen mode, first remove all window decoration - * and set style to popup so it will overlap the taskbar - * then force to maximize on the screen on which it has the most - * overlap. - */ - - - /* store current window rect */ - GetWindowRect( win->Window.Handle, &win->State.OldRect ); - - /* store current window style */ - win->State.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE); - - /* remove decorations from style and add popup style*/ - s &= ~WS_OVERLAPPEDWINDOW; - s |= WS_POPUP; - SetWindowLong(win->Window.Handle, GWL_STYLE, s); - SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - /* For fullscreen mode, find the monitor that is covered the most - * by the window and get its rect as the resize target. - */ - hMonitor= MonitorFromRect(&win->State.OldRect, MONITOR_DEFAULTTONEAREST); - mi.cbSize = sizeof(mi); - GetMonitorInfo(hMonitor, &mi); - rect = mi.rcMonitor; -#else /* if (WINVER >= 0x0500) */ - RECT rect; - - /* For fullscreen mode, force the top-left corner to 0,0 - * and adjust the window rectangle so that the client area - * covers the whole screen. - */ - - rect.left = 0; - rect.top = 0; - rect.right = fgDisplay.ScreenWidth; - rect.bottom = fgDisplay.ScreenHeight; - - AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | - WS_CLIPCHILDREN, FALSE ); -#endif /* (WINVER >= 0x0500) */ - - /* - * then resize window - * SWP_NOACTIVATE Do not activate the window - * SWP_NOOWNERZORDER Do not change position in z-order - * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message - * SWP_NOZORDER Retains the current Z order (ignore 2nd param) - */ - SetWindowPos( fgStructure.CurrentWindow->Window.Handle, - HWND_TOP, - rect.left, - rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | - SWP_NOZORDER - ); - - win->State.IsFullscreen = GL_TRUE; - } -#endif + fgPlatformGlutFullScreen ( win ); } /* @@ -1337,37 +1268,7 @@ win = fgStructure.CurrentWindow; -#if TARGET_HOST_POSIX_X11 - if(glutGet(GLUT_FULL_SCREEN)) { - if(fghToggleFullscreen() != -1) { - win->State.IsFullscreen = GL_FALSE; - } - } - -#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: what about WinCE */ - if (!glutGet(GLUT_FULL_SCREEN)) - { - /* nothing to do */ - return; - } - - /* restore style of window before making it fullscreen */ - SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.OldStyle); - SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - /* Then resize */ - SetWindowPos(win->Window.Handle, - HWND_TOP, - win->State.OldRect.left, - win->State.OldRect.top, - win->State.OldRect.right - win->State.OldRect.left, - win->State.OldRect.bottom - win->State.OldRect.top, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | - SWP_NOZORDER - ); - - win->State.IsFullscreen = GL_FALSE; -#endif + fgPlatformGlutLeaveFullScreen ( win ); } /* @@ -1382,16 +1283,7 @@ win = fgStructure.CurrentWindow; -#if TARGET_HOST_POSIX_X11 - if(fghToggleFullscreen() != -1) { - win->State.IsFullscreen = !win->State.IsFullscreen; - } -#elif TARGET_HOST_MS_WINDOWS - if (!win->State.IsFullscreen) - glutFullScreen(); - else - glutLeaveFullScreen(); -#endif + fgPlatformGlutFullScreenToggle ( win ); } /* Modified: trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-23 05:24:34 UTC (rev 1002) +++ trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-23 05:44:18 UTC (rev 1003) @@ -837,3 +837,232 @@ +/* + * This function makes the current window visible + */ +void fgPlatformGlutShowWindow( void ) +{ + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW ); +} + +/* + * This function hides the current window + */ +void fgPlatformGlutHideWindow( void ) +{ + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE ); +} + +/* + * Iconify the current window (top-level windows only) + */ +void fgPlatformGlutIconifyWindow( void ) +{ + ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE ); +} + +/* + * Set the current window's title + */ +void fgPlatformGlutSetWindowTitle( const char* title ) +{ +#ifdef _WIN32_WCE + { + wchar_t* wstr = fghWstrFromStr(title); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); + free(wstr); + } +#else + SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); +#endif +} + +/* + * Set the current window's iconified title + */ +void fgPlatformGlutSetIconTitle( const char* title ) +{ +#ifdef _WIN32_WCE + { + wchar_t* wstr = fghWstrFromStr(title); + SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); + free(wstr); + } +#else + SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); +#endif +} + +/* + * Change the current window's position + */ +void fgPlatformGlutPositionWindow( int x, int y ) +{ + RECT winRect; + + /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ + GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); + MoveWindow( + fgStructure.CurrentWindow->Window.Handle, + x, + y, + winRect.right - winRect.left, + winRect.bottom - winRect.top, + TRUE + ); +} + +/* + * Lowers the current window (by Z order change) + */ +void fgPlatformGlutPushWindow( void ) +{ + SetWindowPos( + fgStructure.CurrentWindow->Window.Handle, + HWND_BOTTOM, + 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE + ); +} + +/* + * Raises the current window (by Z order change) + */ +void fgPlatformGlutPopWindow( void ) +{ + SetWindowPos( + fgStructure.CurrentWindow->Window.Handle, + HWND_TOP, + 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE + ); +} + +/* + * Resize the current window so that it fits the whole screen + */ +void fgPlatformGlutFullScreen( SFG_Window *win ) +{ +#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */ + + if (glutGet(GLUT_FULL_SCREEN)) + { + /* Leave full screen state before entering fullscreen again (resizing?) */ + glutLeaveFullScreen(); + } + + { +#if(WINVER >= 0x0500) /* Windows 2000 or later */ + DWORD s; + RECT rect; + HMONITOR hMonitor; + MONITORINFO mi; + + /* For fullscreen mode, first remove all window decoration + * and set style to popup so it will overlap the taskbar + * then force to maximize on the screen on which it has the most + * overlap. + */ + + + /* store current window rect */ + GetWindowRect( win->Window.Handle, &win->State.OldRect ); + + /* store current window style */ + win->State.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE); + + /* remove decorations from style and add popup style*/ + s &= ~WS_OVERLAPPEDWINDOW; + s |= WS_POPUP; + SetWindowLong(win->Window.Handle, GWL_STYLE, s); + SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + + /* For fullscreen mode, find the monitor that is covered the most + * by the window and get its rect as the resize target. + */ + hMonitor= MonitorFromRect(&win->State.OldRect, MONITOR_DEFAULTTONEAREST); + mi.cbSize = sizeof(mi); + GetMonitorInfo(hMonitor, &mi); + rect = mi.rcMonitor; +#else /* if (WINVER >= 0x0500) */ + RECT rect; + + /* For fullscreen mode, force the top-left corner to 0,0 + * and adjust the window rectangle so that the client area + * covers the whole screen. + */ + + rect.left = 0; + rect.top = 0; + rect.right = fgDisplay.ScreenWidth; + rect.bottom = fgDisplay.ScreenHeight; + + AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN, FALSE ); +#endif /* (WINVER >= 0x0500) */ + + /* + * then resize window + * SWP_NOACTIVATE Do not activate the window + * SWP_NOOWNERZORDER Do not change position in z-order + * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message + * SWP_NOZORDER Retains the current Z order (ignore 2nd param) + */ + SetWindowPos( fgStructure.CurrentWindow->Window.Handle, + HWND_TOP, + rect.left, + rect.top, + rect.right - rect.left, + rect.bottom - rect.top, + SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | + SWP_NOZORDER + ); + + win->State.IsFullscreen = GL_TRUE; + } +#endif +} + +/* + * If we are fullscreen, resize the current window back to its original size + */ +void fgPlatformGlutLeaveFullScreen( SFG_Window *win ) +{ +#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */ + if (!glutGet(GLUT_FULL_SCREEN)) + { + /* nothing to do */ + return; + } + + /* restore style of window before making it fullscreen */ + SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.OldStyle); + SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + + /* Then resize */ + SetWindowPos(win->Window.Handle, + HWND_TOP, + win->State.OldRect.left, + win->State.OldRect.top, + win->State.OldRect.right - win->State.OldRect.left, + win->State.OldRect.bottom - win->State.OldRect.top, + SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | + SWP_NOZORDER + ); + + win->State.IsFullscreen = GL_FALSE; +#endif +} + +/* + * Toggle the window's full screen state. + */ +void fgPlatformGlutFullScreenToggle( SFG_Window *win ) +{ + if (!win->State.IsFullscreen) + glutFullScreen(); + else + glutLeaveFullScreen(); +} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-24 00:09:46
|
Revision: 1005 http://freeglut.svn.sourceforge.net/freeglut/?rev=1005&view=rev Author: fayjf Date: 2012-01-24 00:09:40 +0000 (Tue, 24 Jan 2012) Log Message: ----------- Putting in Diederick Niehorster's patch from e-mail dated 1/23/12 at 6:48 AM to fix the "WM_TOUCH" bugs inserted in the recent code changes Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_main.c trunk/freeglut/freeglut/src/Common/freeglut_window.c trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_main.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-23 05:46:18 UTC (rev 1004) +++ trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-24 00:09:40 UTC (rev 1005) @@ -70,13 +70,6 @@ # define MIN(a,b) (((a)<(b)) ? (a) : (b)) #endif -#ifdef WM_TOUCH - typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int); - typedef BOOL (WINAPI *pCloseTouchInputHandle)(HTOUCHINPUT); - static pGetTouchInputInfo fghGetTouchInputInfo = (pGetTouchInputInfo)0xDEADBEEF; - static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF; -#endif - extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ); extern void fgPlatformDisplayWindow ( SFG_Window *window ); extern void fgPlatformSleepForEvents( long msec ); Modified: trunk/freeglut/freeglut/src/Common/freeglut_window.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-23 05:46:18 UTC (rev 1004) +++ trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-24 00:09:40 UTC (rev 1005) @@ -89,11 +89,6 @@ #endif /* TARGET_HOST_POSIX_X11 */ -#ifdef WM_TOUCH - typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG); - static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF; -#endif - /* pushing attribute/value pairs into an array */ #define ATTRIB(a) attributes[where++]=(a) #define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);} Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-23 05:46:18 UTC (rev 1004) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-24 00:09:40 UTC (rev 1005) @@ -35,8 +35,15 @@ extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned char layer_type ); +#ifdef WM_TOUCH +typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int); +typedef BOOL (WINAPI *pCloseTouchInputHandle)(HTOUCHINPUT); +static pGetTouchInputInfo fghGetTouchInputInfo = (pGetTouchInputInfo)0xDEADBEEF; +static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF; +#endif + void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ) { RECT windowRect; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-23 05:46:18 UTC (rev 1004) +++ trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-24 00:09:40 UTC (rev 1005) @@ -90,7 +90,12 @@ extern void fghContextCreationError( void ); extern int fghNumberOfAuxBuffersRequested( void ); +#ifdef WM_TOUCH +typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG); +static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF; +#endif + /* * Setup the pixel format for a Win32 window */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-24 04:07:16
|
Revision: 1008 http://freeglut.svn.sourceforge.net/freeglut/?rev=1008&view=rev Author: fayjf Date: 2012-01-24 04:07:10 +0000 (Tue, 24 Jan 2012) Log Message: ----------- Removing some Windows-specific function prototypes from "freeglut_internal.h" Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-24 03:48:12 UTC (rev 1007) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-24 04:07:10 UTC (rev 1008) @@ -918,19 +918,6 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enumerator* enumerator ); -#if TARGET_HOST_MS_WINDOWS -/* - * Helper functions for getting client area from the window rect - * and the window rect from the client area given the style of the window - * (or a valid window pointer from which the style can be queried). - */ -void fghComputeWindowRectFromClientArea_UseStyle ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside ); -void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside ); -void fghComputeClientAreaFromWindowRect ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside ); -RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside ); -void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth); -#endif - /* * fgWindowByHandle returns a (SFG_Window *) value pointing to the * first window in the queue matching the specified window handle. Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-24 03:48:12 UTC (rev 1007) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-24 04:07:10 UTC (rev 1008) @@ -42,6 +42,13 @@ static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF; #endif +/* + * Helper functions for getting client area from the window rect + * and the window rect from the client area given the style of the window + * (or a valid window pointer from which the style can be queried). + */ +extern void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside ); +extern RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside ); void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ) Modified: trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-24 03:48:12 UTC (rev 1007) +++ trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-24 04:07:10 UTC (rev 1008) @@ -32,7 +32,15 @@ extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned char layer_type ); +/* + * Helper functions for getting client area from the window rect + * and the window rect from the client area given the style of the window + * (or a valid window pointer from which the style can be queried). + */ +extern RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside ); +extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth); + /* The following include file is available from SGI but is not standard: * #include <GL/wglext.h> * So we copy the necessary parts out of it to support the multisampling query Modified: trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-24 03:48:12 UTC (rev 1007) +++ trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-24 04:07:10 UTC (rev 1008) @@ -95,7 +95,14 @@ static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF; #endif +/* + * Helper functions for getting client area from the window rect + * and the window rect from the client area given the style of the window + * (or a valid window pointer from which the style can be queried). + */ +extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth); + /* * Setup the pixel format for a Win32 window */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 02:52:27
|
Revision: 1012 http://freeglut.svn.sourceforge.net/freeglut/?rev=1012&view=rev Author: fayjf Date: 2012-01-29 02:52:21 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the Windows platform-specific "SwapBuffers" calls into a Windows platform-specific file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_display.c trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_display.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_display.c 2012-01-29 02:45:04 UTC (rev 1011) +++ trunk/freeglut/freeglut/src/Common/freeglut_display.c 2012-01-29 02:52:21 UTC (rev 1012) @@ -28,6 +28,18 @@ #include <GL/freeglut.h> #include "freeglut_internal.h" + +/* Function prototypes */ +extern void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow ); + + +#if TARGET_HOST_POSIX_X11 +void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow ) +{ + glXSwapBuffers( pDisplayPtr->Display, CurrentWindow->Window.Handle ); +} +#endif + /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ /* @@ -61,11 +73,7 @@ if( ! fgStructure.CurrentWindow->Window.DoubleBuffered ) return; -#if TARGET_HOST_POSIX_X11 - glXSwapBuffers( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); -#elif TARGET_HOST_MS_WINDOWS - SwapBuffers( fgStructure.CurrentWindow->Window.Device ); -#endif + fgPlatformGlutSwapBuffers( &fgDisplay.pDisplay, fgStructure.CurrentWindow ); /* GLUT_FPS env var support */ if( fgState.FPSInterval ) Modified: trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c 2012-01-29 02:45:04 UTC (rev 1011) +++ trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c 2012-01-29 02:52:21 UTC (rev 1012) @@ -0,0 +1,37 @@ +/* + * freeglut_display_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sat Jan 28, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "../Common/freeglut_internal.h" + + + + +void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow ) +{ + SwapBuffers( CurrentWindow->Window.Device ); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 03:04:41
|
Revision: 1013 http://freeglut.svn.sourceforge.net/freeglut/?rev=1013&view=rev Author: fayjf Date: 2012-01-29 03:04:35 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the platform-specific window handle and context type definitions into platform-specific code regions Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 02:52:21 UTC (rev 1012) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 03:04:35 UTC (rev 1013) @@ -214,6 +214,7 @@ /* Platform-specific includes */ #if TARGET_HOST_POSIX_X11 + typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay; struct tagSFG_PlatformDisplay { @@ -247,6 +248,15 @@ int DisplayPointerY; /* saved Y location of the pointer */ }; + +/* + * Make "freeglut" window handle and context types so that we don't need so + * much conditionally-compiled code later in the library. + */ +typedef Window SFG_WindowHandleType ; +typedef GLXContext SFG_WindowContextType ; + + #endif #if TARGET_HOST_MS_WINDOWS #include "../mswin/freeglut_internal_mswin.h" @@ -419,22 +429,6 @@ }; /* - * Make "freeglut" window handle and context types so that we don't need so - * much conditionally-compiled code later in the library. - */ -#if TARGET_HOST_POSIX_X11 - -typedef Window SFG_WindowHandleType ; -typedef GLXContext SFG_WindowContextType ; - -#elif TARGET_HOST_MS_WINDOWS - -typedef HWND SFG_WindowHandleType ; -typedef HGLRC SFG_WindowContextType ; - -#endif - -/* * A window and its OpenGL context. The contents of this structure * are highly dependant on the target operating system we aim at... */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 02:52:21 UTC (rev 1012) +++ trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 03:04:35 UTC (rev 1013) @@ -36,6 +36,13 @@ char *DisplayName; /* Display name for multi display support*/ }; +/* + * Make "freeglut" window handle and context types so that we don't need so + * much conditionally-compiled code later in the library. + */ +typedef HWND SFG_WindowHandleType ; +typedef HGLRC SFG_WindowContextType ; + #endif /* FREEGLUT_INTERNAL_MSWIN_H */ \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 03:15:47
|
Revision: 1014 http://freeglut.svn.sourceforge.net/freeglut/?rev=1014&view=rev Author: fayjf Date: 2012-01-29 03:15:41 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the platform-specific FBConfig and device context variables into platform-specific parts of the code Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/Common/freeglut_state.c trunk/freeglut/freeglut/src/Common/freeglut_structure.c trunk/freeglut/freeglut/src/Common/freeglut_window.c trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 03:15:41 UTC (rev 1014) @@ -255,8 +255,14 @@ */ typedef Window SFG_WindowHandleType ; typedef GLXContext SFG_WindowContextType ; +typedef struct tagSFG_PlatformContext SFG_PlatformContext; +struct tagSFG_PlatformContext +{ + GLXFBConfig* FBConfig; /* The window's FBConfig */ +}; + #endif #if TARGET_HOST_MS_WINDOWS #include "../mswin/freeglut_internal_mswin.h" @@ -438,11 +444,7 @@ SFG_WindowHandleType Handle; /* The window's handle */ SFG_WindowContextType Context; /* The window's OpenGL/WGL context */ -#if TARGET_HOST_POSIX_X11 - GLXFBConfig* FBConfig; /* The window's FBConfig */ -#elif TARGET_HOST_MS_WINDOWS - HDC Device; /* The window's device context */ -#endif + SFG_PlatformContext pContext; /* The window's FBConfig (X11) or device context (Windows) */ int DoubleBuffered; /* Treat the window as double-buffered */ }; Modified: trunk/freeglut/freeglut/src/Common/freeglut_state.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/Common/freeglut_state.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -66,7 +66,7 @@ if( fgStructure.CurrentWindow ) result = glXGetFBConfigAttrib( fgDisplay.Display, - *(fgStructure.CurrentWindow->Window.FBConfig), + *(fgStructure.CurrentWindow->Window.pContext.FBConfig), attribute, &returnValue ); @@ -125,7 +125,7 @@ else { const GLXFBConfig * fbconfig = - fgStructure.CurrentWindow->Window.FBConfig; + fgStructure.CurrentWindow->Window.pContext.FBConfig; XVisualInfo * visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display, *fbconfig ); Modified: trunk/freeglut/freeglut/src/Common/freeglut_structure.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_structure.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/Common/freeglut_structure.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -63,7 +63,7 @@ #if TARGET_HOST_POSIX_X11 void fgPlatformCreateWindow ( SFG_Window *window ) { - window->Window.FBConfig = NULL; + window->Window.pContext.FBConfig = NULL; window->State.OldHeight = window->State.OldWidth = -1; } Modified: trunk/freeglut/freeglut/src/Common/freeglut_window.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -398,7 +398,7 @@ /* "classic" context creation */ Display *dpy = fgDisplay.Display; - GLXFBConfig config = *(window->Window.FBConfig); + GLXFBConfig config = *(window->Window.pContext.FBConfig); int render_type = ( !menu && index_mode ) ? GLX_COLOR_INDEX_TYPE : GLX_RGBA_TYPE; GLXContext share_list = NULL; Bool direct = ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT ); @@ -548,12 +548,12 @@ if( window->IsMenu && ( ! fgStructure.MenuContext ) ) fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB ; - window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs ); + window->Window.pContext.FBConfig = fgChooseFBConfig( &num_FBConfigs ); if( window->IsMenu && ( ! fgStructure.MenuContext ) ) fgState.DisplayMode = current_DisplayMode ; - if( ! window->Window.FBConfig ) + if( ! window->Window.pContext.FBConfig ) { /* * The "fgChooseFBConfig" returned a null meaning that the visual @@ -563,25 +563,25 @@ if( !( fgState.DisplayMode & GLUT_DOUBLE ) ) { fgState.DisplayMode |= GLUT_DOUBLE ; - window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs ); + window->Window.pContext.FBConfig = fgChooseFBConfig( &num_FBConfigs ); fgState.DisplayMode &= ~GLUT_DOUBLE; } if( fgState.DisplayMode & GLUT_MULTISAMPLE ) { fgState.DisplayMode &= ~GLUT_MULTISAMPLE ; - window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs ); + window->Window.pContext.FBConfig = fgChooseFBConfig( &num_FBConfigs ); fgState.DisplayMode |= GLUT_MULTISAMPLE; } } - FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.FBConfig != NULL, + FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.pContext.FBConfig != NULL, "FBConfig with necessary capabilities not found", "fgOpenWindow" ); /* Get the X visual. */ for (i = 0; i < num_FBConfigs; i++) { visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display, - window->Window.FBConfig[i] ); + window->Window.pContext.FBConfig[i] ); if (visualInfo) break; } @@ -750,7 +750,7 @@ { if( window->Window.Context ) glXDestroyContext( fgDisplay.Display, window->Window.Context ); - XFree( window->Window.FBConfig ); + XFree( window->Window.pContext.FBConfig ); if( window->Window.Handle ) { XDestroyWindow( fgDisplay.Display, window->Window.Handle ); Modified: trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/mswin/freeglut_display_mswin.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -33,5 +33,5 @@ void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow ) { - SwapBuffers( CurrentWindow->Window.Device ); + SwapBuffers( CurrentWindow->Window.pContext.Device ); } Modified: trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 03:15:41 UTC (rev 1014) @@ -42,7 +42,13 @@ */ typedef HWND SFG_WindowHandleType ; typedef HGLRC SFG_WindowContextType ; +typedef struct tagSFG_PlatformContext SFG_PlatformContext; +struct tagSFG_PlatformContext +{ + HDC Device; /* The window's device context */ +}; + #endif /* FREEGLUT_INTERNAL_MSWIN_H */ \ No newline at end of file Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -329,7 +329,7 @@ "fgPlatformWindowProc" ); window->Window.Handle = hWnd; - window->Window.Device = GetDC( hWnd ); + window->Window.pContext.Device = GetDC( hWnd ); if( window->IsMenu ) { unsigned int current_DisplayMode = fgState.DisplayMode; @@ -340,7 +340,7 @@ fgState.DisplayMode = current_DisplayMode; if( fgStructure.MenuContext ) - wglMakeCurrent( window->Window.Device, + wglMakeCurrent( window->Window.pContext.Device, fgStructure.MenuContext->MContext ); else @@ -348,11 +348,11 @@ fgStructure.MenuContext = (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); fgStructure.MenuContext->MContext = - wglCreateContext( window->Window.Device ); + wglCreateContext( window->Window.pContext.Device ); } /* window->Window.Context = wglGetCurrentContext (); */ - window->Window.Context = wglCreateContext( window->Window.Device ); + window->Window.Context = wglCreateContext( window->Window.pContext.Device ); } else { @@ -362,13 +362,13 @@ if( ! fgState.UseCurrentContext ) window->Window.Context = - wglCreateContext( window->Window.Device ); + wglCreateContext( window->Window.pContext.Device ); else { window->Window.Context = wglGetCurrentContext( ); if( ! window->Window.Context ) window->Window.Context = - wglCreateContext( window->Window.Device ); + wglCreateContext( window->Window.pContext.Device ); } #if !defined(_WIN32_WCE) @@ -391,7 +391,7 @@ fgSetWindow( current_window ); } - ReleaseDC( window->Window.Handle, window->Window.Device ); + ReleaseDC( window->Window.Handle, window->Window.pContext.Device ); #if defined(_WIN32_WCE) /* Take over button handling */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/mswin/freeglut_state_mswin.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -229,7 +229,7 @@ case GLUT_WINDOW_FORMAT_ID: #if !defined(_WIN32_WCE) if( fgStructure.CurrentWindow != NULL ) - return GetPixelFormat( fgStructure.CurrentWindow->Window.Device ); + return GetPixelFormat( fgStructure.CurrentWindow->Window.pContext.Device ); #endif /* defined(_WIN32_WCE) */ return 0; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-29 03:04:35 UTC (rev 1013) +++ trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-29 03:15:41 UTC (rev 1014) @@ -169,9 +169,9 @@ return; } - wglMakeCurrent( window->Window.Device, window->Window.Context ); + wglMakeCurrent( window->Window.pContext.Device, window->Window.Context ); - if ( !fghIsExtensionSupported( window->Window.Device, "WGL_ARB_create_context" ) ) + if ( !fghIsExtensionSupported( window->Window.pContext.Device, "WGL_ARB_create_context" ) ) { return; } @@ -185,7 +185,7 @@ fgError( "wglCreateContextAttribsARB not found" ); } - context = wglCreateContextAttribsARB( window->Window.Device, 0, attributes ); + context = wglCreateContextAttribsARB( window->Window.pContext.Device, 0, attributes ); if ( context == NULL ) { fghContextCreationError(); @@ -296,7 +296,7 @@ if (checkOnly) current_hDC = CreateDC(TEXT("DISPLAY"), NULL ,NULL ,NULL); else - current_hDC = window->Window.Device; + current_hDC = window->Window.pContext.Device; fghFillPFD( ppfd, current_hDC, layer_type ); pixelformat = ChoosePixelFormat( current_hDC, ppfd ); @@ -370,13 +370,13 @@ { if( fgStructure.CurrentWindow ) ReleaseDC( fgStructure.CurrentWindow->Window.Handle, - fgStructure.CurrentWindow->Window.Device ); + fgStructure.CurrentWindow->Window.pContext.Device ); if ( window ) { - window->Window.Device = GetDC( window->Window.Handle ); + window->Window.pContext.Device = GetDC( window->Window.Handle ); wglMakeCurrent( - window->Window.Device, + window->Window.pContext.Device, window->Window.Context ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 03:22:34
|
Revision: 1015 http://freeglut.svn.sourceforge.net/freeglut/?rev=1015&view=rev Author: fayjf Date: 2012-01-29 03:22:28 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the "glutCreateWindowWithExit" and its associated variable to the Windows-specific files Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/Common/freeglut_window.c trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 03:15:41 UTC (rev 1014) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 03:22:28 UTC (rev 1015) @@ -991,10 +991,6 @@ SFG_Proc fghGetProcAddress( const char *procName ); -#if TARGET_HOST_MS_WINDOWS -extern void (__cdecl *__glutExitFunc)( int return_value ); -#endif - #endif /* FREEGLUT_INTERNAL_H */ /*** END OF FILE ***/ Modified: trunk/freeglut/freeglut/src/Common/freeglut_window.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-29 03:15:41 UTC (rev 1014) +++ trunk/freeglut/freeglut/src/Common/freeglut_window.c 2012-01-29 03:22:28 UTC (rev 1015) @@ -986,14 +986,6 @@ GL_FALSE, GL_FALSE )->ID; } -#if TARGET_HOST_MS_WINDOWS -int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - return glutCreateWindow( title ); -} -#endif - /* * This function creates a sub window. */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 03:15:41 UTC (rev 1014) +++ trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 03:22:28 UTC (rev 1015) @@ -49,6 +49,8 @@ }; +/* Function to be called on exit */ +extern void (__cdecl *__glutExitFunc)( int return_value ); #endif /* FREEGLUT_INTERNAL_MSWIN_H */ \ No newline at end of file Modified: trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-29 03:15:41 UTC (rev 1014) +++ trunk/freeglut/freeglut/src/mswin/freeglut_window_mswin.c 2012-01-29 03:22:28 UTC (rev 1015) @@ -1078,3 +1078,12 @@ } +/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */ + + +int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) ) +{ + __glutExitFunc = exit_function; + return glutCreateWindow( title ); +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 03:25:37
|
Revision: 1016 http://freeglut.svn.sourceforge.net/freeglut/?rev=1016&view=rev Author: fayjf Date: 2012-01-29 03:25:31 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the Windows-specific "glutInitWithExit" function to a Windows-specific file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_init.c trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_init.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-29 03:22:28 UTC (rev 1015) +++ trunk/freeglut/freeglut/src/Common/freeglut_init.c 2012-01-29 03:25:31 UTC (rev 1016) @@ -648,16 +648,6 @@ } } -#if TARGET_HOST_MS_WINDOWS -void (__cdecl *__glutExitFunc)( int return_value ) = NULL; - -void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - glutInit(pargc, argv); -} -#endif - /* * Undoes all the "glutInit" stuff */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-29 03:22:28 UTC (rev 1015) +++ trunk/freeglut/freeglut/src/mswin/freeglut_init_mswin.c 2012-01-29 03:25:31 UTC (rev 1016) @@ -329,3 +329,14 @@ +/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */ + + +void (__cdecl *__glutExitFunc)( int return_value ) = NULL; + +void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) ) +{ + __glutExitFunc = exit_function; + glutInit(pargc, argv); +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 03:38:17
|
Revision: 1017 http://freeglut.svn.sourceforge.net/freeglut/?rev=1017&view=rev Author: fayjf Date: 2012-01-29 03:38:11 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Splitting platform-specific code out of "fgJoystickClose" function Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_joystick.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 03:25:31 UTC (rev 1016) +++ trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 03:38:11 UTC (rev 1017) @@ -455,6 +455,9 @@ #endif +/* External function declarations (mostly platform-specific) */ +extern void fgPlatformJoystickClose ( int ident ); + /* * The static joystick structure pointer */ @@ -1619,49 +1622,57 @@ /* * */ -void fgJoystickClose( void ) -{ - int ident ; - for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) - { - if( fgJoystick[ ident ] ) - { #if TARGET_HOST_MACINTOSH - ISpSuspend( ); - ISpStop( ); - ISpShutdown( ); +void fgPlatformJoystickClose ( int ident ) +{ + ISpSuspend( ); + ISpStop( ); + ISpShutdown( ); +} #endif #if TARGET_HOST_MAC_OSX - ( *( fgJoystick[ ident ]->hidDev ) )-> - close( fgJoystick[ ident ]->hidDev ); +void fgPlatformJoystickClose ( int ident ) +{ + ( *( fgJoystick[ ident ]->hidDev ) )-> + close( fgJoystick[ ident ]->hidDev ); +} #endif -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - /* Do nothing special */ -#endif - #if TARGET_HOST_POSIX_X11 +void fgPlatformJoystickClose ( int ident ) +{ #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - if( fgJoystick[ident]->os ) - { - if( ! fgJoystick[ ident ]->error ) - close( fgJoystick[ ident ]->os->fd ); + if( fgJoystick[ident]->os ) + { + if( ! fgJoystick[ ident ]->error ) + close( fgJoystick[ ident ]->os->fd ); #ifdef HAVE_USB_JS - if( fgJoystick[ ident ]->os->hids ) - free (fgJoystick[ ident ]->os->hids); - if( fgJoystick[ ident ]->os->hid_data_buf ) - free( fgJoystick[ ident ]->os->hid_data_buf ); + if( fgJoystick[ ident ]->os->hids ) + free (fgJoystick[ ident ]->os->hids); + if( fgJoystick[ ident ]->os->hid_data_buf ) + free( fgJoystick[ ident ]->os->hid_data_buf ); #endif - free( fgJoystick[ident]->os ); - } + free( fgJoystick[ident]->os ); + } #endif - if( ! fgJoystick[ident]->error ) - close( fgJoystick[ ident ]->fd ); + if( ! fgJoystick[ident]->error ) + close( fgJoystick[ ident ]->fd ); +} #endif + +void fgJoystickClose( void ) +{ + int ident ; + for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) + { + if( fgJoystick[ ident ] ) + { + fgPlatformJoystickClose ( ident ); + free( fgJoystick[ ident ] ); fgJoystick[ ident ] = NULL; /* show joystick has been deinitialized */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 03:25:31 UTC (rev 1016) +++ trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 03:38:11 UTC (rev 1017) @@ -0,0 +1,38 @@ +/* + * freeglut_joystick_mswin.c + * + * The Windows-specific mouse cursor related stuff. + * + * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. + * Written by John F. Fay, <fa...@so...> + * Creation date: Sat Jan 28, 2012 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <GL/freeglut.h> +#include "../Common/freeglut_internal.h" + + +#if !defined(_WIN32_WCE) +void fgPlatformJoystickClose ( int ident ) +{ + /* Do nothing special */ +} +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 04:26:03
|
Revision: 1021 http://freeglut.svn.sourceforge.net/freeglut/?rev=1021&view=rev Author: fayjf Date: 2012-01-29 04:25:56 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving non-Windows platform-specific code lower in the file again to avoid declaration problems and splitting out the platform-specific fghJoystickOpen code Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_joystick.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 04:01:24 UTC (rev 1020) +++ trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 04:25:56 UTC (rev 1021) @@ -388,6 +388,7 @@ /* External function declarations (mostly platform-specific) */ +extern void fgPlatformJoystickOpen( SFG_Joystick* joy ); extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ); extern void fgPlatformJoystickClose ( int ident ); @@ -398,132 +399,6 @@ static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ]; /* - * Platform-Specific Code - */ - -#if TARGET_HOST_MACINTOSH -void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) -{ - fgJoystick[ ident ]->id = ident; - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */ - fgJoystick[ ident ]->error = GL_FALSE; -} - - -void fgPlatformJoystickClose ( int ident ) -{ - ISpSuspend( ); - ISpStop( ); - ISpShutdown( ); -} -#endif - -#if TARGET_HOST_MAC_OSX -void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) -{ - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - fgJoystick[ ident ]->num_axes = 0; - fgJoystick[ ident ]->num_buttons = 0; - - if( numDevices < 0 ) - { - /* do first-time init (since we can't over-ride jsInit, hmm */ - numDevices = 0; - - mach_port_t masterPort; - IOReturn rv = IOMasterPort( bootstrap_port, &masterPort ); - if( rv != kIOReturnSuccess ) - { - fgWarning( "error getting master Mach port" ); - return; - } - fghJoystickFindDevices( masterPort ); - } - - if ( ident >= numDevices ) - { - fgJoystick[ ident ]->error = GL_TRUE; - return; - } - - /* get the name now too */ - CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] ); - CFTypeRef ref = CFDictionaryGetValue( properties, - CFSTR( kIOHIDProductKey ) ); - if (!ref) - ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) ); - - if( !ref || - !CFStringGetCString( ( CFStringRef )ref, name, 128, - CFStringGetSystemEncoding( ) ) ) - { - fgWarning( "error getting device name" ); - name[ 0 ] = '\0'; - } -} - - -void fgPlatformJoystickClose ( int ident ) -{ - ( *( fgJoystick[ ident ]->hidDev ) )-> - close( fgJoystick[ ident ]->hidDev ); -} -#endif - -#if TARGET_HOST_POSIX_X11 -void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) -{ -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - - fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) ); - memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) ); - if( ident < USB_IDENT_OFFSET ) - fgJoystick[ ident ]->os->is_analog = 1; - if( fgJoystick[ ident ]->os->is_analog ) - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident ); - else - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV, - ident - USB_IDENT_OFFSET ); -#elif defined( __linux__ ) - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - - snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident ); - - if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 ) - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); -#endif -} - - -void fgPlatformJoystickClose ( int ident ) -{ -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - if( fgJoystick[ident]->os ) - { - if( ! fgJoystick[ ident ]->error ) - close( fgJoystick[ ident ]->os->fd ); -#ifdef HAVE_USB_JS - if( fgJoystick[ ident ]->os->hids ) - free (fgJoystick[ ident ]->os->hids); - if( fgJoystick[ ident ]->os->hid_data_buf ) - free( fgJoystick[ ident ]->os->hid_data_buf ); -#endif - free( fgJoystick[ident]->os ); - } -#endif - - if( ! fgJoystick[ident]->error ) - close( fgJoystick[ ident ]->fd ); -} -#endif - - - -/* * Read the raw joystick data */ static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) @@ -1054,109 +929,16 @@ } #endif -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -/* Inspired by - http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp +/* + * Platform-Specific Code */ -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib, "advapi32.lib") -# endif -static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz ) -{ - char buffer [ 256 ]; - - char OEMKey [ 256 ]; - - HKEY hKey; - DWORD dwcb; - LONG lr; - - if ( joy->error ) - return 0; - - /* Open .. MediaResources\CurrentJoystickSettings */ - _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s", - REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey, - REGSTR_KEY_JOYCURR ); - - lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Get OEM Key name */ - dwcb = sizeof(OEMKey); - - /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */ - _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME ); - - lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb); - RegCloseKey ( hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Open OEM Key from ...MediaProperties */ - _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey ); - - lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Get OEM Name */ - dwcb = buf_sz; - - lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf, - &dwcb ); - RegCloseKey ( hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - return 1; -} -#endif - - -static void fghJoystickOpen( SFG_Joystick* joy ) -{ - int i = 0; #if TARGET_HOST_MACINTOSH +void fgPlatformJoystickOpen( SFG_Joystick* joy ) +{ + int i = 0; OSStatus err; -#endif -#if TARGET_HOST_MAC_OSX - IOReturn rv; - SInt32 score; - IOCFPlugInInterface **plugin; - HRESULT pluginResult; - - CFDictionaryRef props; - CFTypeRef topLevelElement; -#endif -#if TARGET_HOST_POSIX_X11 -# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - char *cp; -# endif -# ifdef JS_NEW - unsigned char u; -# else -# if defined( __linux__ ) || TARGET_HOST_SOLARIS - int counter = 0; -# endif -# endif -#endif - - /* Silence gcc, the correct #ifdefs would be too fragile... */ - (void)i; - - /* - * Default values (for no joystick -- each conditional will reset the - * error flag) - */ - joy->error = TRUE; - joy->num_axes = joy->num_buttons = 0; - joy->name[ 0 ] = '\0'; - -#if TARGET_HOST_MACINTOSH /* XXX FIXME: get joystick name in Mac */ err = ISpStartup( ); @@ -1254,9 +1036,37 @@ } else joy->num_buttons = joy->num_axes = 0; +} + + +void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) +{ + fgJoystick[ ident ]->id = ident; + snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */ + fgJoystick[ ident ]->error = GL_FALSE; +} + + +void fgPlatformJoystickClose ( int ident ) +{ + ISpSuspend( ); + ISpStop( ); + ISpShutdown( ); +} #endif #if TARGET_HOST_MAC_OSX +void fgPlatformJoystickOpen( SFG_Joystick* joy ) +{ + IOReturn rv; + SInt32 score; + IOCFPlugInInterface **plugin; + + HRESULT pluginResult; + + CFDictionaryRef props; + CFTypeRef topLevelElement; + if( joy->id >= numDevices ) { fgWarning( "device index out of range in fgJoystickOpen()" ); @@ -1304,72 +1114,78 @@ enumerateElements( topLevelElement ); CFRelease( props ); -#endif +} -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - joy->js.dwFlags = JOY_RETURNALL; - joy->js.dwSize = sizeof( joy->js ); - memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) ); +void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) +{ + fgJoystick[ ident ]->id = ident; + fgJoystick[ ident ]->error = GL_FALSE; + fgJoystick[ ident ]->num_axes = 0; + fgJoystick[ ident ]->num_buttons = 0; - joy->error = - ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) != - JOYERR_NOERROR ); - - if( joy->jsCaps.wNumAxes == 0 ) + if( numDevices < 0 ) { - joy->num_axes = 0; - joy->error = GL_TRUE; - } - else - { - /* Device name from jsCaps is often "Microsoft PC-joystick driver", - * at least for USB. Try to get the real name from the registry. - */ - if ( ! fghJoystickGetOEMProductName( joy, joy->name, - sizeof( joy->name ) ) ) - { - fgWarning( "JS: Failed to read joystick name from registry" ); - strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) ); - } + /* do first-time init (since we can't over-ride jsInit, hmm */ + numDevices = 0; - /* Windows joystick drivers may provide any combination of - * X,Y,Z,R,U,V,POV - not necessarily the first n of these. - */ - if( joy->jsCaps.wCaps & JOYCAPS_HASPOV ) + mach_port_t masterPort; + IOReturn rv = IOMasterPort( bootstrap_port, &masterPort ); + if( rv != kIOReturnSuccess ) { - joy->num_axes = _JS_MAX_AXES; - joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */ - joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */ + fgWarning( "error getting master Mach port" ); + return; } - else - joy->num_axes = 6; + fghJoystickFindDevices( masterPort ); + } - joy->min[ 5 ] = ( float )joy->jsCaps.wVmin; - joy->max[ 5 ] = ( float )joy->jsCaps.wVmax; - joy->min[ 4 ] = ( float )joy->jsCaps.wUmin; - joy->max[ 4 ] = ( float )joy->jsCaps.wUmax; - joy->min[ 3 ] = ( float )joy->jsCaps.wRmin; - joy->max[ 3 ] = ( float )joy->jsCaps.wRmax; - joy->min[ 2 ] = ( float )joy->jsCaps.wZmin; - joy->max[ 2 ] = ( float )joy->jsCaps.wZmax; - joy->min[ 1 ] = ( float )joy->jsCaps.wYmin; - joy->max[ 1 ] = ( float )joy->jsCaps.wYmax; - joy->min[ 0 ] = ( float )joy->jsCaps.wXmin; - joy->max[ 0 ] = ( float )joy->jsCaps.wXmax; + if ( ident >= numDevices ) + { + fgJoystick[ ident ]->error = GL_TRUE; + return; } - /* Guess all the rest judging on the axes extremals */ - for( i = 0; i < joy->num_axes; i++ ) + /* get the name now too */ + CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] ); + CFTypeRef ref = CFDictionaryGetValue( properties, + CFSTR( kIOHIDProductKey ) ); + if (!ref) + ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) ); + + if( !ref || + !CFStringGetCString( ( CFStringRef )ref, name, 128, + CFStringGetSystemEncoding( ) ) ) { - joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f; - joy->dead_band[ i ] = 0.0f; - joy->saturate [ i ] = 1.0f; + fgWarning( "error getting device name" ); + name[ 0 ] = '\0'; } +} + + +void fgPlatformJoystickClose ( int ident ) +{ + ( *( fgJoystick[ ident ]->hidDev ) )-> + close( fgJoystick[ ident ]->hidDev ); +} #endif #if TARGET_HOST_POSIX_X11 +void fgPlatformJoystickOpen( SFG_Joystick* joy ) +{ #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) + int i = 0; + char *cp; +#endif +#ifdef JS_NEW + unsigned char u; +#else +# if defined( __linux__ ) || TARGET_HOST_SOLARIS + int i = 0; + int counter = 0; +# endif +#endif + +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) for( i = 0; i < _JS_MAX_AXES; i++ ) joy->os->cache_axes[ i ] = 0.0f; @@ -1546,9 +1362,77 @@ joy->saturate [ i ] = 1.0f; } #endif +} + + +void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) +{ +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) + fgJoystick[ ident ]->id = ident; + fgJoystick[ ident ]->error = GL_FALSE; + + fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) ); + memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) ); + if( ident < USB_IDENT_OFFSET ) + fgJoystick[ ident ]->os->is_analog = 1; + if( fgJoystick[ ident ]->os->is_analog ) + snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident ); + else + snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV, + ident - USB_IDENT_OFFSET ); +#elif defined( __linux__ ) + fgJoystick[ ident ]->id = ident; + fgJoystick[ ident ]->error = GL_FALSE; + + snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident ); + + if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 ) + snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); #endif } + +void fgPlatformJoystickClose ( int ident ) +{ +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) + if( fgJoystick[ident]->os ) + { + if( ! fgJoystick[ ident ]->error ) + close( fgJoystick[ ident ]->os->fd ); +#ifdef HAVE_USB_JS + if( fgJoystick[ ident ]->os->hids ) + free (fgJoystick[ ident ]->os->hids); + if( fgJoystick[ ident ]->os->hid_data_buf ) + free( fgJoystick[ ident ]->os->hid_data_buf ); +#endif + free( fgJoystick[ident]->os ); + } +#endif + + if( ! fgJoystick[ident]->error ) + close( fgJoystick[ ident ]->fd ); +} +#endif + + + + + + +static void fghJoystickOpen( SFG_Joystick* joy ) +{ + /* + * Default values (for no joystick -- each conditional will reset the + * error flag) + */ + joy->error = TRUE; + joy->num_axes = joy->num_buttons = 0; + joy->name[ 0 ] = '\0'; + + fgPlatformJoystickOpen ( joy ); + +} + /* * This function replaces the constructor method in the JS library. */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 04:01:24 UTC (rev 1020) +++ trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 04:25:56 UTC (rev 1021) @@ -30,6 +30,139 @@ #if !defined(_WIN32_WCE) +# include <windows.h> +# include <mmsystem.h> +# include <regstr.h> + + + +/* Inspired by + http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp + */ +# if FREEGLUT_LIB_PRAGMAS +# pragma comment (lib, "advapi32.lib") +# endif + +static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz ) +{ + char buffer [ 256 ]; + + char OEMKey [ 256 ]; + + HKEY hKey; + DWORD dwcb; + LONG lr; + + if ( joy->error ) + return 0; + + /* Open .. MediaResources\CurrentJoystickSettings */ + _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s", + REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey, + REGSTR_KEY_JOYCURR ); + + lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); + + if ( lr != ERROR_SUCCESS ) return 0; + + /* Get OEM Key name */ + dwcb = sizeof(OEMKey); + + /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */ + _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME ); + + lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb); + RegCloseKey ( hKey ); + + if ( lr != ERROR_SUCCESS ) return 0; + + /* Open OEM Key from ...MediaProperties */ + _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey ); + + lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey ); + + if ( lr != ERROR_SUCCESS ) return 0; + + /* Get OEM Name */ + dwcb = buf_sz; + + lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf, + &dwcb ); + RegCloseKey ( hKey ); + + if ( lr != ERROR_SUCCESS ) return 0; + + return 1; +} + + +void fgPlatformJoystickOpen( SFG_Joystick* joy ) +{ + int i = 0; + + joy->js.dwFlags = JOY_RETURNALL; + joy->js.dwSize = sizeof( joy->js ); + + memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) ); + + joy->error = + ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) != + JOYERR_NOERROR ); + + if( joy->jsCaps.wNumAxes == 0 ) + { + joy->num_axes = 0; + joy->error = GL_TRUE; + } + else + { + /* Device name from jsCaps is often "Microsoft PC-joystick driver", + * at least for USB. Try to get the real name from the registry. + */ + if ( ! fghJoystickGetOEMProductName( joy, joy->name, + sizeof( joy->name ) ) ) + { + fgWarning( "JS: Failed to read joystick name from registry" ); + strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) ); + } + + /* Windows joystick drivers may provide any combination of + * X,Y,Z,R,U,V,POV - not necessarily the first n of these. + */ + if( joy->jsCaps.wCaps & JOYCAPS_HASPOV ) + { + joy->num_axes = _JS_MAX_AXES; + joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */ + joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */ + } + else + joy->num_axes = 6; + + joy->min[ 5 ] = ( float )joy->jsCaps.wVmin; + joy->max[ 5 ] = ( float )joy->jsCaps.wVmax; + joy->min[ 4 ] = ( float )joy->jsCaps.wUmin; + joy->max[ 4 ] = ( float )joy->jsCaps.wUmax; + joy->min[ 3 ] = ( float )joy->jsCaps.wRmin; + joy->max[ 3 ] = ( float )joy->jsCaps.wRmax; + joy->min[ 2 ] = ( float )joy->jsCaps.wZmin; + joy->max[ 2 ] = ( float )joy->jsCaps.wZmax; + joy->min[ 1 ] = ( float )joy->jsCaps.wYmin; + joy->max[ 1 ] = ( float )joy->jsCaps.wYmax; + joy->min[ 0 ] = ( float )joy->jsCaps.wXmin; + joy->max[ 0 ] = ( float )joy->jsCaps.wXmax; + } + + /* Guess all the rest judging on the axes extremals */ + for( i = 0; i < joy->num_axes; i++ ) + { + joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f; + joy->dead_band[ i ] = 0.0f; + joy->saturate [ i ] = 1.0f; + } +} + + + void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) { switch( ident ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 04:32:47
|
Revision: 1022 http://freeglut.svn.sourceforge.net/freeglut/?rev=1022&view=rev Author: fayjf Date: 2012-01-29 04:32:41 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Splitting the platform-specific "fgSystemTime" code into its own functions Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_main.c trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_main.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-29 04:25:56 UTC (rev 1021) +++ trunk/freeglut/freeglut/src/Common/freeglut_main.c 2012-01-29 04:32:41 UTC (rev 1022) @@ -72,6 +72,7 @@ extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height ); extern void fgPlatformDisplayWindow ( SFG_Window *window ); +extern unsigned long fgPlatformSystemTime ( void ); extern void fgPlatformSleepForEvents( long msec ); extern void fgPlatformProcessSingleEvent ( void ); extern void fgPlatformMainLoopPreliminaryWork ( void ); @@ -174,7 +175,17 @@ { fghRedrawWindow ( window ) ; } + + +unsigned long fgPlatformSystemTime ( void ) +{ +#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY + struct timeval now; + gettimeofday( &now, NULL ); + return now.tv_usec/1000 + now.tv_sec*1000; #endif +} +#endif static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) @@ -262,18 +273,9 @@ * when subtracting an initial start time, unless the total time exceeds * 32-bit, where the GLUT API return value is also overflowed. */ -unsigned long fgSystemTime(void) { -#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY - struct timeval now; - gettimeofday( &now, NULL ); - return now.tv_usec/1000 + now.tv_sec*1000; -#elif TARGET_HOST_MS_WINDOWS -# if defined(_WIN32_WCE) - return GetTickCount(); -# else - return timeGetTime(); -# endif -#endif +unsigned long fgSystemTime(void) +{ + return fgPlatformSystemTime (); } /* Modified: trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-29 04:25:56 UTC (rev 1021) +++ trunk/freeglut/freeglut/src/mswin/freeglut_main_mswin.c 2012-01-29 04:32:41 UTC (rev 1022) @@ -108,6 +108,16 @@ } +unsigned long fgPlatformSystemTime ( void ) +{ +#if defined(_WIN32_WCE) + return GetTickCount(); +#else + return timeGetTime(); +#endif +} + + void fgPlatformSleepForEvents( long msec ) { MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 04:45:23
|
Revision: 1023 http://freeglut.svn.sourceforge.net/freeglut/?rev=1023&view=rev Author: fayjf Date: 2012-01-29 04:45:17 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Splitting the platform-specific joystick "Raw Read" code into its own functions Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_joystick.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 04:32:41 UTC (rev 1022) +++ trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 04:45:17 UTC (rev 1023) @@ -388,6 +388,7 @@ /* External function declarations (mostly platform-specific) */ +extern void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ); extern void fgPlatformJoystickOpen( SFG_Joystick* joy ); extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ); extern void fgPlatformJoystickClose ( int ident ); @@ -403,16 +404,6 @@ */ static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) { -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - MMRESULT status; -#else - int status; -#endif - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) - int len; -#endif - int i; /* Defaults */ @@ -426,291 +417,7 @@ if( joy->error ) return; -#if TARGET_HOST_MACINTOSH - if ( buttons ) - { - *buttons = 0; - - for ( i = 0; i < joy->num_buttons; i++ ) - { - UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i + isp_num_axis ], &state); - ISP_CHECK_ERR(err) - - *buttons |= state << i; - } - } - - if ( axes ) - { - for ( i = 0; i < joy->num_axes; i++ ) - { - UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i ], &state ); - ISP_CHECK_ERR(err) - - axes [i] = (float) state; - } - } -#endif - -#if TARGET_HOST_MAC_OSX - if ( buttons != NULL ) - { - *buttons = 0; - - for ( i = 0; i < joy->num_buttons; i++ ) - { - IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, buttonCookies[i], &hidEvent ); - if ( hidEvent.value ) - *buttons |= 1 << i; - } - } - - if ( axes != NULL ) - { - for ( i = 0; i < joy->num_axes; i++ ) - { - IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent ); - axes[i] = hidEvent.value; - } - } -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - status = joyGetPosEx( joy->js_id, &joy->js ); - - if ( status != JOYERR_NOERROR ) - { - joy->error = GL_TRUE; - return; - } - - if ( buttons ) - *buttons = joy->js.dwButtons; - - if ( axes ) - { - /* - * WARNING - Fall through case clauses!! - */ - switch ( joy->num_axes ) - { - case 8: - /* Generate two POV axes from the POV hat angle. - * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in - * hundredths of a degree, or 0xFFFF when idle. - */ - if ( ( joy->js.dwPOV & 0xFFFF ) == 0xFFFF ) - { - axes [ 6 ] = 0.0; - axes [ 7 ] = 0.0; - } - else - { - /* This is the contentious bit: how to convert angle to X/Y. - * wk: I know of no define for PI that we could use here: - * SG_PI would pull in sg, M_PI is undefined for MSVC - * But the accuracy of the value of PI is very unimportant at - * this point. - */ - float s = (float) sin ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); - float c = (float) cos ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); - - /* Convert to coordinates on a square so that North-East - * is (1,1) not (.7,.7), etc. - * s and c cannot both be zero so we won't divide by zero. - */ - if ( fabs ( s ) < fabs ( c ) ) - { - axes [ 6 ] = ( c < 0.0 ) ? -s/c : s/c ; - axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f; - } - else - { - axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f; - axes [ 7 ] = ( s < 0.0 ) ? -c/s : c/s ; - } - } - - case 6: axes[5] = (float) joy->js.dwVpos; - case 5: axes[4] = (float) joy->js.dwUpos; - case 4: axes[3] = (float) joy->js.dwRpos; - case 3: axes[2] = (float) joy->js.dwZpos; - case 2: axes[1] = (float) joy->js.dwYpos; - case 1: axes[0] = (float) joy->js.dwXpos; - } - } -#endif - -#if TARGET_HOST_POSIX_X11 -# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) - if ( joy->os->is_analog ) - { - int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) ); - if ( status != sizeof(joy->os->ajs) ) { - perror ( joy->os->fname ); - joy->error = GL_TRUE; - return; - } - if ( buttons != NULL ) - *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 ); - - if ( axes != NULL ) - { - axes[0] = (float) joy->os->ajs.x; - axes[1] = (float) joy->os->ajs.y; - } - - return; - } - -# ifdef HAVE_USB_JS - while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen ) - { - struct hid_item *h; - - for ( h = joy->os->hids; h; h = h->next ) - { - int d = hid_get_data ( joy->os->hid_data_buf, h ); - - int page = HID_PAGE ( h->usage ); - int usage = HID_USAGE ( h->usage ); - - if ( page == HUP_GENERIC_DESKTOP ) - { - int i; - for ( i = 0; i < joy->num_axes; i++ ) - if (joy->os->axes_usage[i] == usage) - { - if (usage == HUG_HAT_SWITCH) - { - if (d < 0 || d > 8) - d = 0; /* safety */ - joy->os->cache_axes[i] = (float)hatmap_x[d]; - joy->os->cache_axes[i + 1] = (float)hatmap_y[d]; - } - else - { - joy->os->cache_axes[i] = (float)d; - } - break; - } - } - else if (page == HUP_BUTTON) - { - if (usage > 0 && usage < _JS_MAX_BUTTONS + 1) - { - if (d) - joy->os->cache_buttons |= (1 << ( usage - 1 )); - else - joy->os->cache_buttons &= ~(1 << ( usage - 1 )); - } - } - } - } -#ifdef HAVE_ERRNO_H - if ( len < 0 && errno != EAGAIN ) -#else - if ( len < 0 ) -#endif - { - perror( joy->os->fname ); - joy->error = 1; - } - if ( buttons != NULL ) *buttons = joy->os->cache_buttons; - if ( axes != NULL ) - memcpy ( axes, joy->os->cache_axes, sizeof(float) * joy->num_axes ); -# endif -# endif - -# ifdef JS_NEW - - while ( 1 ) - { - status = read ( joy->fd, &joy->js, sizeof(struct js_event) ); - - if ( status != sizeof( struct js_event ) ) - { -#ifdef HAVE_ERRNO_H - if ( errno == EAGAIN ) - { - /* Use the old values */ - if ( buttons ) - *buttons = joy->tmp_buttons; - if ( axes ) - memcpy( axes, joy->tmp_axes, - sizeof( float ) * joy->num_axes ); - return; - } -#endif - - fgWarning ( "%s", joy->fname ); - joy->error = GL_TRUE; - return; - } - - switch ( joy->js.type & ~JS_EVENT_INIT ) - { - case JS_EVENT_BUTTON: - if( joy->js.value == 0 ) /* clear the flag */ - joy->tmp_buttons &= ~( 1 << joy->js.number ); - else - joy->tmp_buttons |= ( 1 << joy->js.number ); - break; - - case JS_EVENT_AXIS: - if ( joy->js.number < joy->num_axes ) - { - joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value; - - if( axes ) - memcpy( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); - } - break; - - default: - fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" ); - - /* use the old values */ - - if ( buttons != NULL ) *buttons = joy->tmp_buttons; - if ( axes != NULL ) - memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); - - return; - } - - if( buttons ) - *buttons = joy->tmp_buttons; - } -# else - - status = read( joy->fd, &joy->js, JS_RETURN ); - - if ( status != JS_RETURN ) - { - fgWarning( "%s", joy->fname ); - joy->error = GL_TRUE; - return; - } - - if ( buttons ) -# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */ -# else - *buttons = joy->js.buttons; -# endif - - if ( axes ) - { - axes[ 0 ] = (float) joy->js.x; - axes[ 1 ] = (float) joy->js.y; - } -# endif -#endif + fgPlatformJoystickRawRead ( joy, buttons, axes ); } /* @@ -934,6 +641,38 @@ */ #if TARGET_HOST_MACINTOSH +void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) +{ + int i; + + if ( buttons ) + { + *buttons = 0; + + for ( i = 0; i < joy->num_buttons; i++ ) + { + UInt32 state; + int err = ISpElement_GetSimpleState ( isp_elem [ i + isp_num_axis ], &state); + ISP_CHECK_ERR(err) + + *buttons |= state << i; + } + } + + if ( axes ) + { + for ( i = 0; i < joy->num_axes; i++ ) + { + UInt32 state; + int err = ISpElement_GetSimpleState ( isp_elem [ i ], &state ); + ISP_CHECK_ERR(err) + + axes [i] = (float) state; + } + } +} + + void fgPlatformJoystickOpen( SFG_Joystick* joy ) { int i = 0; @@ -1056,6 +795,35 @@ #endif #if TARGET_HOST_MAC_OSX +void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) +{ + int i; + + if ( buttons != NULL ) + { + *buttons = 0; + + for ( i = 0; i < joy->num_buttons; i++ ) + { + IOHIDEventStruct hidEvent; + (*(joy->hidDev))->getElementValue ( joy->hidDev, buttonCookies[i], &hidEvent ); + if ( hidEvent.value ) + *buttons |= 1 << i; + } + } + + if ( axes != NULL ) + { + for ( i = 0; i < joy->num_axes; i++ ) + { + IOHIDEventStruct hidEvent; + (*(joy->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent ); + axes[i] = hidEvent.value; + } + } +} + + void fgPlatformJoystickOpen( SFG_Joystick* joy ) { IOReturn rv; @@ -1170,6 +938,181 @@ #endif #if TARGET_HOST_POSIX_X11 +void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) +{ + int status; + + int i; + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) + int len; + + if ( joy->os->is_analog ) + { + int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) ); + if ( status != sizeof(joy->os->ajs) ) { + perror ( joy->os->fname ); + joy->error = GL_TRUE; + return; + } + if ( buttons != NULL ) + *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 ); + + if ( axes != NULL ) + { + axes[0] = (float) joy->os->ajs.x; + axes[1] = (float) joy->os->ajs.y; + } + + return; + } + +# ifdef HAVE_USB_JS + while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen ) + { + struct hid_item *h; + + for ( h = joy->os->hids; h; h = h->next ) + { + int d = hid_get_data ( joy->os->hid_data_buf, h ); + + int page = HID_PAGE ( h->usage ); + int usage = HID_USAGE ( h->usage ); + + if ( page == HUP_GENERIC_DESKTOP ) + { + int i; + for ( i = 0; i < joy->num_axes; i++ ) + if (joy->os->axes_usage[i] == usage) + { + if (usage == HUG_HAT_SWITCH) + { + if (d < 0 || d > 8) + d = 0; /* safety */ + joy->os->cache_axes[i] = (float)hatmap_x[d]; + joy->os->cache_axes[i + 1] = (float)hatmap_y[d]; + } + else + { + joy->os->cache_axes[i] = (float)d; + } + break; + } + } + else if (page == HUP_BUTTON) + { + if (usage > 0 && usage < _JS_MAX_BUTTONS + 1) + { + if (d) + joy->os->cache_buttons |= (1 << ( usage - 1 )); + else + joy->os->cache_buttons &= ~(1 << ( usage - 1 )); + } + } + } + } +# ifdef HAVE_ERRNO_H + if ( len < 0 && errno != EAGAIN ) +# else + if ( len < 0 ) +# endif + { + perror( joy->os->fname ); + joy->error = 1; + } + if ( buttons != NULL ) *buttons = joy->os->cache_buttons; + if ( axes != NULL ) + memcpy ( axes, joy->os->cache_axes, sizeof(float) * joy->num_axes ); +# endif +#endif + +#ifdef JS_NEW + + while ( 1 ) + { + status = read ( joy->fd, &joy->js, sizeof(struct js_event) ); + + if ( status != sizeof( struct js_event ) ) + { +# ifdef HAVE_ERRNO_H + if ( errno == EAGAIN ) + { + /* Use the old values */ + if ( buttons ) + *buttons = joy->tmp_buttons; + if ( axes ) + memcpy( axes, joy->tmp_axes, + sizeof( float ) * joy->num_axes ); + return; + } +# endif + + fgWarning ( "%s", joy->fname ); + joy->error = GL_TRUE; + return; + } + + switch ( joy->js.type & ~JS_EVENT_INIT ) + { + case JS_EVENT_BUTTON: + if( joy->js.value == 0 ) /* clear the flag */ + joy->tmp_buttons &= ~( 1 << joy->js.number ); + else + joy->tmp_buttons |= ( 1 << joy->js.number ); + break; + + case JS_EVENT_AXIS: + if ( joy->js.number < joy->num_axes ) + { + joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value; + + if( axes ) + memcpy( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); + } + break; + + default: + fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" ); + + /* use the old values */ + + if ( buttons != NULL ) *buttons = joy->tmp_buttons; + if ( axes != NULL ) + memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); + + return; + } + + if( buttons ) + *buttons = joy->tmp_buttons; + } +#else + + status = read( joy->fd, &joy->js, JS_RETURN ); + + if ( status != JS_RETURN ) + { + fgWarning( "%s", joy->fname ); + joy->error = GL_TRUE; + return; + } + + if ( buttons ) +# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) + *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */ +# else + *buttons = joy->js.buttons; +# endif + + if ( axes ) + { + axes[ 0 ] = (float) joy->js.x; + axes[ 1 ] = (float) joy->js.y; + } +#endif +} + + void fgPlatformJoystickOpen( SFG_Joystick* joy ) { #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) Modified: trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 04:32:41 UTC (rev 1022) +++ trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 04:45:17 UTC (rev 1023) @@ -36,6 +36,78 @@ + +void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) +{ + MMRESULT status; + + status = joyGetPosEx( joy->js_id, &joy->js ); + + if ( status != JOYERR_NOERROR ) + { + joy->error = GL_TRUE; + return; + } + + if ( buttons ) + *buttons = joy->js.dwButtons; + + if ( axes ) + { + /* + * WARNING - Fall through case clauses!! + */ + switch ( joy->num_axes ) + { + case 8: + /* Generate two POV axes from the POV hat angle. + * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in + * hundredths of a degree, or 0xFFFF when idle. + */ + if ( ( joy->js.dwPOV & 0xFFFF ) == 0xFFFF ) + { + axes [ 6 ] = 0.0; + axes [ 7 ] = 0.0; + } + else + { + /* This is the contentious bit: how to convert angle to X/Y. + * wk: I know of no define for PI that we could use here: + * SG_PI would pull in sg, M_PI is undefined for MSVC + * But the accuracy of the value of PI is very unimportant at + * this point. + */ + float s = (float) sin ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); + float c = (float) cos ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); + + /* Convert to coordinates on a square so that North-East + * is (1,1) not (.7,.7), etc. + * s and c cannot both be zero so we won't divide by zero. + */ + if ( fabs ( s ) < fabs ( c ) ) + { + axes [ 6 ] = ( c < 0.0 ) ? -s/c : s/c ; + axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f; + } + else + { + axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f; + axes [ 7 ] = ( s < 0.0 ) ? -c/s : c/s ; + } + } + + case 6: axes[5] = (float) joy->js.dwVpos; + case 5: axes[4] = (float) joy->js.dwUpos; + case 4: axes[3] = (float) joy->js.dwRpos; + case 3: axes[2] = (float) joy->js.dwZpos; + case 2: axes[1] = (float) joy->js.dwYpos; + case 1: axes[0] = (float) joy->js.dwXpos; + } + } +} + + + /* Inspired by http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 05:25:17
|
Revision: 1025 http://freeglut.svn.sourceforge.net/freeglut/?rev=1025&view=rev Author: fayjf Date: 2012-01-29 05:25:10 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moved the platform-specific variables in the Joystick structure into their own platform-specific substructure. Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/Common/freeglut_joystick.c trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 04:46:29 UTC (rev 1024) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 05:25:10 UTC (rev 1025) @@ -788,50 +788,47 @@ #if TARGET_HOST_MACINTOSH # define _JS_MAX_AXES 9 -#endif - -#if TARGET_HOST_MAC_OSX -# define _JS_MAX_AXES 16 -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -# define _JS_MAX_AXES 8 -#endif - -#if TARGET_HOST_POSIX_X11 -# define _JS_MAX_AXES 16 -#endif - -/* - * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class. - * See "js.h" lines 80-178. - */ -typedef struct tagSFG_Joystick SFG_Joystick; -struct tagSFG_Joystick +typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; +struct tagSFG_PlatformJoystick { -#if TARGET_HOST_MACINTOSH #define ISP_NUM_AXIS 9 #define ISP_NUM_NEEDS 41 ISpElementReference isp_elem [ ISP_NUM_NEEDS ]; ISpNeed isp_needs [ ISP_NUM_NEEDS ]; +}; #endif #if TARGET_HOST_MAC_OSX +# define _JS_MAX_AXES 16 +typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; +struct tagSFG_PlatformJoystick +{ IOHIDDeviceInterface ** hidDev; IOHIDElementCookie buttonCookies[41]; IOHIDElementCookie axisCookies[_JS_MAX_AXES]; - long minReport[_JS_MAX_AXES], - maxReport[_JS_MAX_AXES]; +/* The next two variables are not used anywhere */ +/* long minReport[_JS_MAX_AXES], + * maxReport[_JS_MAX_AXES]; + */ +}; #endif #if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) +# define _JS_MAX_AXES 8 +typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; +struct tagSFG_PlatformJoystick +{ JOYCAPS jsCaps; JOYINFOEX js; UINT js_id; +}; #endif - #if TARGET_HOST_POSIX_X11 +# define _JS_MAX_AXES 16 +typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; +struct tagSFG_PlatformJoystick +{ # if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) struct os_specific_s *os; # endif @@ -846,8 +843,18 @@ char fname [ 128 ]; int fd; +}; #endif +/* + * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class. + * See "js.h" lines 80-178. + */ +typedef struct tagSFG_Joystick SFG_Joystick; +struct tagSFG_Joystick +{ + SFG_PlatformJoystick pJoystick; + int id; GLboolean error; char name [ 128 ]; Modified: trunk/freeglut/freeglut/src/Common/freeglut_joystick.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 04:46:29 UTC (rev 1024) +++ trunk/freeglut/freeglut/src/Common/freeglut_joystick.c 2012-01-29 05:25:10 UTC (rev 1025) @@ -594,7 +594,7 @@ CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementCookieKey) ), kCFNumberLongType, &cookie); - axisCookies[index] = (IOHIDElementCookie) cookie; + joy->pJoystick.axisCookies[index] = (IOHIDElementCookie) cookie; CFNumberGetValue ((CFNumberRef) CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMinKey) ), @@ -618,7 +618,7 @@ CFDictionaryGetValue ( button, CFSTR(kIOHIDElementCookieKey) ), kCFNumberLongType, &cookie); - joy->buttonCookies[num_buttons++] = (IOHIDElementCookie) cookie; + joy->pJoystick.buttonCookies[num_buttons++] = (IOHIDElementCookie) cookie; /* anything else for buttons? */ } @@ -645,7 +645,7 @@ for ( i = 0; i < joy->num_buttons; i++ ) { UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i + isp_num_axis ], &state); + int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i + ISP_NUM_AXIS ], &state); ISP_CHECK_ERR(err) *buttons |= state << i; @@ -657,7 +657,7 @@ for ( i = 0; i < joy->num_axes; i++ ) { UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i ], &state ); + int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i ], &state ); ISP_CHECK_ERR(err) axes [i] = (float) state; @@ -682,7 +682,7 @@ joy->error = GL_TRUE; /* initialize the needs structure */ - ISpNeed temp_isp_needs[ isp_num_needs ] = + ISpNeed temp_isp_needs[ ISP_NUM_NEEDS ] = { { "\pX-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, { "\pY-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, @@ -728,7 +728,7 @@ { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, }; - memcpy( joy->isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) ); + memcpy( joy->pJoystick.isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) ); /* next two calls allow keyboard and mouse to emulate other input @@ -743,17 +743,17 @@ ISP_CHECK_ERR(err) */ - err = ISpElement_NewVirtualFromNeeds( joy->isp_num_needs, - joy->isp_needs, joy->isp_elem, + err = ISpElement_NewVirtualFromNeeds( ISP_NUM_NEEDS, + joy->pJoystick.isp_needs, joy->pJoystick.isp_elem, 0 ); ISP_CHECK_ERR( err ) - err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, + err = ISpInit( ISP_NUM_NEEDS, joy->pJoystick.isp_needs, joy->pJoystick.isp_elem, 'freeglut', nil, 0, 128, 0 ); ISP_CHECK_ERR( err ) - joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis; - joy->num_axes = joy->isp_num_axis; + joy->num_buttons = ISP_NUM_NEEDS - ISP_NUM_AXIS; + joy->num_axes = ISP_NUM_AXIS; for( i = 0; i < joy->num_axes; i++ ) { @@ -774,7 +774,7 @@ void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) { fgJoystick[ ident ]->id = ident; - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */ + snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident ); /* FIXME */ fgJoystick[ ident ]->error = GL_FALSE; } @@ -799,7 +799,7 @@ for ( i = 0; i < joy->num_buttons; i++ ) { IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, buttonCookies[i], &hidEvent ); + (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.buttonCookies[i], &hidEvent ); if ( hidEvent.value ) *buttons |= 1 << i; } @@ -810,7 +810,7 @@ for ( i = 0; i < joy->num_axes; i++ ) { IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent ); + (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.axisCookies[i], &hidEvent ); axes[i] = hidEvent.value; } } @@ -849,18 +849,18 @@ pluginResult = ( *plugin )->QueryInterface( plugin, CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), - &( LPVOID )joy->hidDev + &( LPVOID )joy->pJoystick.hidDev ); if( pluginResult != S_OK ) fgWarning ( "QI-ing IO plugin to HID Device interface failed" ); ( *plugin )->Release( plugin ); /* don't leak a ref */ - if( joy->hidDev == NULL ) + if( joy->pJoystick.hidDev == NULL ) return; /* store the interface in this instance */ - rv = ( *( joy->hidDev ) )->open( joy->hidDev, 0 ); + rv = ( *( joy->pJoystick.hidDev ) )->open( joy->pJoystick.hidDev, 0 ); if( rv != kIOReturnSuccess ) { fgWarning( "error opening device interface"); @@ -925,8 +925,8 @@ void fgPlatformJoystickClose ( int ident ) { - ( *( fgJoystick[ ident ]->hidDev ) )-> - close( fgJoystick[ ident ]->hidDev ); + ( *( fgJoystick[ ident ]->pJoystick.hidDev ) )-> + close( fgJoystick[ ident ]->pJoystick.hidDev ); } #endif @@ -940,34 +940,34 @@ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) int len; - if ( joy->os->is_analog ) + if ( joy->pJoystick.os->is_analog ) { - int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) ); - if ( status != sizeof(joy->os->ajs) ) { - perror ( joy->os->fname ); + int status = read ( joy->pJoystick.os->fd, &joy->pJoystick.os->ajs, sizeof(joy->pJoystick.os->ajs) ); + if ( status != sizeof(joy->pJoystick.os->ajs) ) { + perror ( joy->pJoystick.os->fname ); joy->error = GL_TRUE; return; } if ( buttons != NULL ) - *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 ); + *buttons = ( joy->pJoystick.os->ajs.b1 ? 1 : 0 ) | ( joy->pJoystick.os->ajs.b2 ? 2 : 0 ); if ( axes != NULL ) { - axes[0] = (float) joy->os->ajs.x; - axes[1] = (float) joy->os->ajs.y; + axes[0] = (float) joy->pJoystick.os->ajs.x; + axes[1] = (float) joy->pJoystick.os->ajs.y; } return; } # ifdef HAVE_USB_JS - while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen ) + while ( ( len = read ( joy->pJoystick.os->fd, joy->pJoystick.os->hid_data_buf, joy->pJoystick.os->hid_dlen ) ) == joy->pJoystick.os->hid_dlen ) { struct hid_item *h; - for ( h = joy->os->hids; h; h = h->next ) + for ( h = joy->pJoystick.os->hids; h; h = h->next ) { - int d = hid_get_data ( joy->os->hid_data_buf, h ); + int d = hid_get_data ( joy->pJoystick.os->hid_data_buf, h ); int page = HID_PAGE ( h->usage ); int usage = HID_USAGE ( h->usage ); @@ -976,18 +976,18 @@ { int i; for ( i = 0; i < joy->num_axes; i++ ) - if (joy->os->axes_usage[i] == usage) + if (joy->pJoystick.os->axes_usage[i] == usage) { if (usage == HUG_HAT_SWITCH) { if (d < 0 || d > 8) d = 0; /* safety */ - joy->os->cache_axes[i] = (float)hatmap_x[d]; - joy->os->cache_axes[i + 1] = (float)hatmap_y[d]; + joy->pJoystick.os->cache_axes[i] = (float)hatmap_x[d]; + joy->pJoystick.os->cache_axes[i + 1] = (float)hatmap_y[d]; } else { - joy->os->cache_axes[i] = (float)d; + joy->pJoystick.os->cache_axes[i] = (float)d; } break; } @@ -997,9 +997,9 @@ if (usage > 0 && usage < _JS_MAX_BUTTONS + 1) { if (d) - joy->os->cache_buttons |= (1 << ( usage - 1 )); + joy->pJoystick.os->cache_buttons |= (1 << ( usage - 1 )); else - joy->os->cache_buttons &= ~(1 << ( usage - 1 )); + joy->pJoystick.os->cache_buttons &= ~(1 << ( usage - 1 )); } } } @@ -1010,12 +1010,12 @@ if ( len < 0 ) # endif { - perror( joy->os->fname ); + perror( joy->pJoystick.os->fname ); joy->error = 1; } - if ( buttons != NULL ) *buttons = joy->os->cache_buttons; + if ( buttons != NULL ) *buttons = joy->pJoystick.os->cache_buttons; if ( axes != NULL ) - memcpy ( axes, joy->os->cache_axes, sizeof(float) * joy->num_axes ); + memcpy ( axes, joy->pJoystick.os->cache_axes, sizeof(float) * joy->num_axes ); # endif #endif @@ -1023,7 +1023,7 @@ while ( 1 ) { - status = read ( joy->fd, &joy->js, sizeof(struct js_event) ); + status = read ( joy->pJoystick.fd, &joy->pJoystick.js, sizeof(struct js_event) ); if ( status != sizeof( struct js_event ) ) { @@ -1032,35 +1032,35 @@ { /* Use the old values */ if ( buttons ) - *buttons = joy->tmp_buttons; + *buttons = joy->pJoystick.tmp_buttons; if ( axes ) - memcpy( axes, joy->tmp_axes, + memcpy( axes, joy->pJoystick.tmp_axes, sizeof( float ) * joy->num_axes ); return; } # endif - fgWarning ( "%s", joy->fname ); + fgWarning ( "%s", joy->pJoystick.fname ); joy->error = GL_TRUE; return; } - switch ( joy->js.type & ~JS_EVENT_INIT ) + switch ( joy->pJoystick.js.type & ~JS_EVENT_INIT ) { case JS_EVENT_BUTTON: - if( joy->js.value == 0 ) /* clear the flag */ - joy->tmp_buttons &= ~( 1 << joy->js.number ); + if( joy->pJoystick.js.value == 0 ) /* clear the flag */ + joy->pJoystick.tmp_buttons &= ~( 1 << joy->pJoystick.js.number ); else - joy->tmp_buttons |= ( 1 << joy->js.number ); + joy->pJoystick.tmp_buttons |= ( 1 << joy->pJoystick.js.number ); break; case JS_EVENT_AXIS: - if ( joy->js.number < joy->num_axes ) + if ( joy->pJoystick.js.number < joy->num_axes ) { - joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value; + joy->pJoystick.tmp_axes[ joy->pJoystick.js.number ] = ( float )joy->pJoystick.js.value; if( axes ) - memcpy( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); + memcpy( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes ); } break; @@ -1069,38 +1069,38 @@ /* use the old values */ - if ( buttons != NULL ) *buttons = joy->tmp_buttons; + if ( buttons != NULL ) *buttons = joy->pJoystick.tmp_buttons; if ( axes != NULL ) - memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); + memcpy ( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes ); return; } if( buttons ) - *buttons = joy->tmp_buttons; + *buttons = joy->pJoystick.tmp_buttons; } #else - status = read( joy->fd, &joy->js, JS_RETURN ); + status = read( joy->pJoystick.fd, &joy->pJoystick.js, JS_RETURN ); if ( status != JS_RETURN ) { - fgWarning( "%s", joy->fname ); + fgWarning( "%s", joy->pJoystick.fname ); joy->error = GL_TRUE; return; } if ( buttons ) # if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */ + *buttons = ( joy->pJoystick.js.b1 ? 1 : 0 ) | ( joy->pJoystick.js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */ # else - *buttons = joy->js.buttons; + *buttons = joy->pJoystick.js.buttons; # endif if ( axes ) { - axes[ 0 ] = (float) joy->js.x; - axes[ 1 ] = (float) joy->js.y; + axes[ 0 ] = (float) joy->pJoystick.js.x; + axes[ 1 ] = (float) joy->pJoystick.js.y; } #endif } @@ -1123,25 +1123,25 @@ #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) for( i = 0; i < _JS_MAX_AXES; i++ ) - joy->os->cache_axes[ i ] = 0.0f; + joy->pJoystick.os->cache_axes[ i ] = 0.0f; - joy->os->cache_buttons = 0; + joy->pJoystick.os->cache_buttons = 0; - joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK); + joy->pJoystick.os->fd = open( joy->pJoystick.os->fname, O_RDONLY | O_NONBLOCK); #ifdef HAVE_ERRNO_H - if( joy->os->fd < 0 && errno == EACCES ) - fgWarning ( "%s exists but is not readable by you", joy->os->fname ); + if( joy->pJoystick.os->fd < 0 && errno == EACCES ) + fgWarning ( "%s exists but is not readable by you", joy->pJoystick.os->fname ); #endif - joy->error =( joy->os->fd < 0 ); + joy->error =( joy->pJoystick.os->fd < 0 ); if( joy->error ) return; joy->num_axes = 0; joy->num_buttons = 0; - if( joy->os->is_analog ) + if( joy->pJoystick.os->is_analog ) { FILE *joyfile; char joyfname[ 1024 ]; @@ -1183,15 +1183,15 @@ } # ifdef HAVE_USB_JS - if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes, + if( ! fghJoystickInitializeHID( joy->pJoystick.os, &joy->num_axes, &joy->num_buttons ) ) { - close( joy->os->fd ); + close( joy->pJoystick.os->fd ); joy->error = GL_TRUE; return; } - cp = strrchr( joy->os->fname, '/' ); + cp = strrchr( joy->pJoystick.os->fname, '/' ); if( cp ) { if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) == @@ -1208,7 +1208,7 @@ * to be quite unreliable for analog-to-USB converters. Punt for * now. */ - if( joy->os->axes_usage[ i ] == HUG_HAT_SWITCH ) + if( joy->pJoystick.os->axes_usage[ i ] == HUG_HAT_SWITCH ) { joy->max [ i ] = 1.0f; joy->center[ i ] = 0.0f; @@ -1234,14 +1234,14 @@ # ifdef JS_NEW for( i = 0; i < _JS_MAX_AXES; i++ ) - joy->tmp_axes[ i ] = 0.0f; + joy->pJoystick.tmp_axes[ i ] = 0.0f; - joy->tmp_buttons = 0; + joy->pJoystick.tmp_buttons = 0; # endif - joy->fd = open( joy->fname, O_RDONLY ); + joy->pJoystick.fd = open( joy->pJoystick.fname, O_RDONLY ); - joy->error =( joy->fd < 0 ); + joy->error =( joy->pJoystick.fd < 0 ); if( joy->error ) return; @@ -1252,12 +1252,12 @@ * to the upper byte of an uninitialized word doesn't work. * 9 April 2003 */ - ioctl( joy->fd, JSIOCGAXES, &u ); + ioctl( joy->pJoystick.fd, JSIOCGAXES, &u ); joy->num_axes = u; - ioctl( joy->fd, JSIOCGBUTTONS, &u ); + ioctl( joy->pJoystick.fd, JSIOCGBUTTONS, &u ); joy->num_buttons = u; - ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name ); - fcntl( joy->fd, F_SETFL, O_NONBLOCK ); + ioctl( joy->pJoystick.fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name ); + fcntl( joy->pJoystick.fd, F_SETFL, O_NONBLOCK ); # endif /* @@ -1307,23 +1307,23 @@ fgJoystick[ ident ]->id = ident; fgJoystick[ ident ]->error = GL_FALSE; - fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) ); - memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) ); + fgJoystick[ ident ]->pJoystick.os = calloc( 1, sizeof( struct os_specific_s ) ); + memset( fgJoystick[ ident ]->pJoystick.os, 0, sizeof( struct os_specific_s ) ); if( ident < USB_IDENT_OFFSET ) - fgJoystick[ ident ]->os->is_analog = 1; - if( fgJoystick[ ident ]->os->is_analog ) - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident ); + fgJoystick[ ident ]->pJoystick.os->is_analog = 1; + if( fgJoystick[ ident ]->pJoystick.os->is_analog ) + snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", AJSDEV, ident ); else - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV, + snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", UHIDDEV, ident - USB_IDENT_OFFSET ); #elif defined( __linux__ ) fgJoystick[ ident ]->id = ident; fgJoystick[ ident ]->error = GL_FALSE; - snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident ); + snprintf( fgJoystick[ident]->pJoystick.fname, sizeof(fgJoystick[ident]->pJoystick.fname), "/dev/input/js%d", ident ); - if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 ) - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); + if( access( fgJoystick[ ident ]->pJoystick.fname, F_OK ) != 0 ) + snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident ); #endif } @@ -1331,22 +1331,22 @@ void fgPlatformJoystickClose ( int ident ) { #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) - if( fgJoystick[ident]->os ) + if( fgJoystick[ident]->pJoystick.os ) { if( ! fgJoystick[ ident ]->error ) - close( fgJoystick[ ident ]->os->fd ); + close( fgJoystick[ ident ]->pJoystick.os->fd ); #ifdef HAVE_USB_JS - if( fgJoystick[ ident ]->os->hids ) - free (fgJoystick[ ident ]->os->hids); - if( fgJoystick[ ident ]->os->hid_data_buf ) - free( fgJoystick[ ident ]->os->hid_data_buf ); + if( fgJoystick[ ident ]->pJoystick.os->hids ) + free (fgJoystick[ ident ]->pJoystick.os->hids); + if( fgJoystick[ ident ]->pJoystick.os->hid_data_buf ) + free( fgJoystick[ ident ]->pJoystick.os->hid_data_buf ); #endif - free( fgJoystick[ident]->os ); + free( fgJoystick[ident]->pJoystick.os ); } #endif if( ! fgJoystick[ident]->error ) - close( fgJoystick[ ident ]->fd ); + close( fgJoystick[ ident ]->pJoystick.fd ); } #endif Modified: trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 04:46:29 UTC (rev 1024) +++ trunk/freeglut/freeglut/src/mswin/freeglut_joystick_mswin.c 2012-01-29 05:25:10 UTC (rev 1025) @@ -41,7 +41,7 @@ { MMRESULT status; - status = joyGetPosEx( joy->js_id, &joy->js ); + status = joyGetPosEx( joy->pJoystick.js_id, &joy->pJoystick.js ); if ( status != JOYERR_NOERROR ) { @@ -50,7 +50,7 @@ } if ( buttons ) - *buttons = joy->js.dwButtons; + *buttons = joy->pJoystick.js.dwButtons; if ( axes ) { @@ -64,7 +64,7 @@ * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in * hundredths of a degree, or 0xFFFF when idle. */ - if ( ( joy->js.dwPOV & 0xFFFF ) == 0xFFFF ) + if ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) == 0xFFFF ) { axes [ 6 ] = 0.0; axes [ 7 ] = 0.0; @@ -77,8 +77,8 @@ * But the accuracy of the value of PI is very unimportant at * this point. */ - float s = (float) sin ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); - float c = (float) cos ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); + float s = (float) sin ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); + float c = (float) cos ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); /* Convert to coordinates on a square so that North-East * is (1,1) not (.7,.7), etc. @@ -96,12 +96,12 @@ } } - case 6: axes[5] = (float) joy->js.dwVpos; - case 5: axes[4] = (float) joy->js.dwUpos; - case 4: axes[3] = (float) joy->js.dwRpos; - case 3: axes[2] = (float) joy->js.dwZpos; - case 2: axes[1] = (float) joy->js.dwYpos; - case 1: axes[0] = (float) joy->js.dwXpos; + case 6: axes[5] = (float) joy->pJoystick.js.dwVpos; + case 5: axes[4] = (float) joy->pJoystick.js.dwUpos; + case 4: axes[3] = (float) joy->pJoystick.js.dwRpos; + case 3: axes[2] = (float) joy->pJoystick.js.dwZpos; + case 2: axes[1] = (float) joy->pJoystick.js.dwYpos; + case 1: axes[0] = (float) joy->pJoystick.js.dwXpos; } } } @@ -130,7 +130,7 @@ /* Open .. MediaResources\CurrentJoystickSettings */ _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s", - REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey, + REGSTR_PATH_JOYCONFIG, joy->pJoystick.jsCaps.szRegKey, REGSTR_KEY_JOYCURR ); lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); @@ -141,7 +141,7 @@ dwcb = sizeof(OEMKey); /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */ - _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME ); + _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->pJoystick.js_id + 1, REGSTR_VAL_JOYOEMNAME ); lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb); RegCloseKey ( hKey ); @@ -172,16 +172,16 @@ { int i = 0; - joy->js.dwFlags = JOY_RETURNALL; - joy->js.dwSize = sizeof( joy->js ); + joy->pJoystick.js.dwFlags = JOY_RETURNALL; + joy->pJoystick.js.dwSize = sizeof( joy->pJoystick.js ); - memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) ); + memset( &joy->pJoystick.jsCaps, 0, sizeof( joy->pJoystick.jsCaps ) ); joy->error = - ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) != + ( joyGetDevCaps( joy->pJoystick.js_id, &joy->pJoystick.jsCaps, sizeof( joy->pJoystick.jsCaps ) ) != JOYERR_NOERROR ); - if( joy->jsCaps.wNumAxes == 0 ) + if( joy->pJoystick.jsCaps.wNumAxes == 0 ) { joy->num_axes = 0; joy->error = GL_TRUE; @@ -195,13 +195,13 @@ sizeof( joy->name ) ) ) { fgWarning( "JS: Failed to read joystick name from registry" ); - strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) ); + strncpy( joy->name, joy->pJoystick.jsCaps.szPname, sizeof( joy->name ) ); } /* Windows joystick drivers may provide any combination of * X,Y,Z,R,U,V,POV - not necessarily the first n of these. */ - if( joy->jsCaps.wCaps & JOYCAPS_HASPOV ) + if( joy->pJoystick.jsCaps.wCaps & JOYCAPS_HASPOV ) { joy->num_axes = _JS_MAX_AXES; joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */ @@ -210,18 +210,18 @@ else joy->num_axes = 6; - joy->min[ 5 ] = ( float )joy->jsCaps.wVmin; - joy->max[ 5 ] = ( float )joy->jsCaps.wVmax; - joy->min[ 4 ] = ( float )joy->jsCaps.wUmin; - joy->max[ 4 ] = ( float )joy->jsCaps.wUmax; - joy->min[ 3 ] = ( float )joy->jsCaps.wRmin; - joy->max[ 3 ] = ( float )joy->jsCaps.wRmax; - joy->min[ 2 ] = ( float )joy->jsCaps.wZmin; - joy->max[ 2 ] = ( float )joy->jsCaps.wZmax; - joy->min[ 1 ] = ( float )joy->jsCaps.wYmin; - joy->max[ 1 ] = ( float )joy->jsCaps.wYmax; - joy->min[ 0 ] = ( float )joy->jsCaps.wXmin; - joy->max[ 0 ] = ( float )joy->jsCaps.wXmax; + joy->min[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmin; + joy->max[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmax; + joy->min[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmin; + joy->max[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmax; + joy->min[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmin; + joy->max[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmax; + joy->min[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmin; + joy->max[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmax; + joy->min[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmin; + joy->max[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmax; + joy->min[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmin; + joy->max[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmax; } /* Guess all the rest judging on the axes extremals */ @@ -240,11 +240,11 @@ switch( ident ) { case 0: - fgJoystick[ ident ]->js_id = JOYSTICKID1; + fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID1; fgJoystick[ ident ]->error = GL_FALSE; break; case 1: - fgJoystick[ ident ]->js_id = JOYSTICKID2; + fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID2; fgJoystick[ ident ]->error = GL_FALSE; break; default: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 05:27:00
|
Revision: 1026 http://freeglut.svn.sourceforge.net/freeglut/?rev=1026&view=rev Author: fayjf Date: 2012-01-29 05:26:54 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the Windows-specific joystick definitions into the Windows-specific header file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_internal.h trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h Modified: trunk/freeglut/freeglut/src/Common/freeglut_internal.h =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 05:25:10 UTC (rev 1025) +++ trunk/freeglut/freeglut/src/Common/freeglut_internal.h 2012-01-29 05:26:54 UTC (rev 1026) @@ -813,17 +813,6 @@ }; #endif -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -# define _JS_MAX_AXES 8 -typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; -struct tagSFG_PlatformJoystick -{ - JOYCAPS jsCaps; - JOYINFOEX js; - UINT js_id; -}; -#endif - #if TARGET_HOST_POSIX_X11 # define _JS_MAX_AXES 16 typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; Modified: trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 05:25:10 UTC (rev 1025) +++ trunk/freeglut/freeglut/src/mswin/freeglut_internal_mswin.h 2012-01-29 05:26:54 UTC (rev 1026) @@ -49,6 +49,20 @@ }; +/* Joystick-Specific Definitions */ +#if !defined(_WIN32_WCE) +# define _JS_MAX_AXES 8 +typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; +struct tagSFG_PlatformJoystick +{ + JOYCAPS jsCaps; + JOYINFOEX js; + UINT js_id; +}; +#endif + + + /* Function to be called on exit */ extern void (__cdecl *__glutExitFunc)( int return_value ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-01-29 13:07:00
|
Revision: 1027 http://freeglut.svn.sourceforge.net/freeglut/?rev=1027&view=rev Author: fayjf Date: 2012-01-29 13:06:54 +0000 (Sun, 29 Jan 2012) Log Message: ----------- Moving the Windows-specific "__glutCreateMenuWIthExit" function to the Windows-specific file Modified Paths: -------------- trunk/freeglut/freeglut/src/Common/freeglut_menu.c trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c Modified: trunk/freeglut/freeglut/src/Common/freeglut_menu.c =================================================================== --- trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-29 05:26:54 UTC (rev 1026) +++ trunk/freeglut/freeglut/src/Common/freeglut_menu.c 2012-01-29 13:06:54 UTC (rev 1027) @@ -783,14 +783,6 @@ return fgCreateMenu( callback )->ID; } -#if TARGET_HOST_MS_WINDOWS -int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - return glutCreateMenu( callback ); -} -#endif - /* * Destroys a menu object, removing all references to it */ Modified: trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-29 05:26:54 UTC (rev 1026) +++ trunk/freeglut/freeglut/src/mswin/freeglut_menu_mswin.c 2012-01-29 13:06:54 UTC (rev 1027) @@ -34,3 +34,15 @@ *x = glutGet ( GLUT_SCREEN_WIDTH ); *y = glutGet ( GLUT_SCREEN_HEIGHT ); } + + + +/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */ + + +int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) ) +{ + __glutExitFunc = exit_function; + return glutCreateMenu( callback ); +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |