moving fgPlatformReshapeWindow and fgPlatformDisplayWindow from fg_main_x to fg_window_x. Hope this didn't break anything for X11 or andriod

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1504 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-02-13 10:28:26 +00:00
parent 4f1f85c231
commit 813addede1
8 changed files with 108 additions and 116 deletions

View File

@ -67,7 +67,6 @@ SET(FREEGLUT_SRCS
src/fg_input_devices.c
src/fg_joystick.c
src/fg_main.c
src/fg_main.h
src/fg_misc.c
src/fg_overlay.c
src/fg_spaceball.c

View File

@ -28,7 +28,6 @@
#include <GL/freeglut.h>
#include "fg_internal.h"
#include "fg_main.h"
#include "egl/fg_window_egl.h"
#include <android/log.h>
@ -139,22 +138,6 @@ static unsigned char key_ascii(struct android_app* app, AInputEvent* event) {
return ascii;
}
/*
* Request a window resize
*/
void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
{
fprintf(stderr, "fgPlatformReshapeWindow: STUB\n");
}
/*
* A static helper function to execute display callback for a window
*/
void fgPlatformDisplayWindow ( SFG_Window *window )
{
fghRedrawWindow ( window ) ;
}
unsigned long fgPlatformSystemTime ( void )
{
struct timeval now;

View File

@ -30,8 +30,6 @@
#include "fg_internal.h"
extern void fgPlatformProcessSingleEvent(void);
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 fgPlatformMainLoopPreliminaryWork(void);

View File

@ -32,6 +32,8 @@
#include "egl/fg_window_egl.h"
#include <android/native_app_glue/android_native_app_glue.h>
extern void fghRedrawWindow(SFG_Window *window);
/*
* Opens a window. Requires a SFG_Window object created and attached
* to the freeglut structure. OpenGL context is created here.
@ -85,6 +87,22 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
window->State.Visible = GL_TRUE;
}
/*
* Request a window resize
*/
void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
{
fprintf(stderr, "fgPlatformReshapeWindow: STUB\n");
}
/*
* A static helper function to execute display callback for a window
*/
void fgPlatformDisplayWindow ( SFG_Window *window )
{
fghRedrawWindow ( window ) ;
}
/*
* Closes a window, destroying the frame and OpenGL context
*/

View File

@ -58,82 +58,6 @@ GXOPENINPUT GXOpenInput_ = NULL;
struct GXKeyList gxKeyList;
#endif /* _WIN32_WCE */
/*
* 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( RECT *clientRect, const SFG_Window *window, BOOL posIsOutside );
extern void fghGetClientArea ( RECT *clientRect, const SFG_Window *window, BOOL wantPosOutside );
void fgPlatformReshapeWindow ( 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.
*
* Note on maximizing behavior of Windows: the resize borders are off
* the screen such that the client area extends all the way from the
* leftmost corner to the rightmost corner to maximize screen real
* estate. A caption is still shown however to allow interaction with
* the window controls. This is default behavior of Windows that
* FreeGLUT sticks with. To alter, one would have to check if
* WS_MAXIMIZE style is set when a resize event is triggered, and
* then manually correct the windowRect to put the borders back on
* screen.
*/
/* "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(&windowRect,window,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;
fghGetClientArea( &parentRect, window->Parent, FALSE );
OffsetRect(&windowRect,-parentRect.left,-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
);
/* Set new width and height so we can test for that in WM_SIZE message handler and don't do anything if not needed */
window->State.Width = width;
window->State.Height = height;
}
void fgPlatformDisplayWindow ( SFG_Window *window )
{
RedrawWindow(
window->Window.Handle, NULL, NULL,
RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
);
}
/* Get system time, taking special precautions against 32bit timer wrap.
We use timeGetTime and not GetTickCount because of its better stability,

View File

@ -759,6 +759,74 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
}
void fgPlatformDisplayWindow ( SFG_Window *window )
{
RedrawWindow(
window->Window.Handle, NULL, NULL,
RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
);
}
void fgPlatformReshapeWindow ( 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.
*
* Note on maximizing behavior of Windows: the resize borders are off
* the screen such that the client area extends all the way from the
* leftmost corner to the rightmost corner to maximize screen real
* estate. A caption is still shown however to allow interaction with
* the window controls. This is default behavior of Windows that
* FreeGLUT sticks with. To alter, one would have to check if
* WS_MAXIMIZE style is set when a resize event is triggered, and
* then manually correct the windowRect to put the borders back on
* screen.
*/
/* "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(&windowRect,window,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;
fghGetClientArea( &parentRect, window->Parent, FALSE );
OffsetRect(&windowRect,-parentRect.left,-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
);
/* Set new width and height so we can test for that in WM_SIZE message handler and don't do anything if not needed */
window->State.Width = width;
window->State.Height = height;
}
/*
* Closes a window, destroying the frame and OpenGL context
*/

View File

@ -40,7 +40,6 @@
# define VFPRINTF(s,f,a)
#endif
#include "fg_main.h"
/*
* Try to get the maximum value allowed for ints, falling back to the minimum
@ -72,25 +71,6 @@ static Bool match_motion(Display *dpy, XEvent *xev, XPointer arg);
*/
/*
* Request a window resize
*/
void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
{
XResizeWindow( fgDisplay.pDisplay.Display, window->Window.Handle,
width, height );
XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
}
/*
* A static helper function to execute display callback for a window
*/
void fgPlatformDisplayWindow ( SFG_Window *window )
{
fghRedrawWindow ( window ) ;
}
fg_time_t fgPlatformSystemTime ( void )
{

View File

@ -32,6 +32,8 @@
#include <unistd.h> /* usleep */
#include "../fg_internal.h"
extern void fghRedrawWindow(SFG_Window *window);
#ifdef EGL_VERSION_1_0
#include "egl/fg_window_egl.h"
#define fghCreateNewContext fghCreateNewContextEGL
@ -369,6 +371,26 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
}
/*
* Request a window resize
*/
void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
{
XResizeWindow( fgDisplay.pDisplay.Display, window->Window.Handle,
width, height );
XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
}
/*
* A static helper function to execute display callback for a window
*/
void fgPlatformDisplayWindow ( SFG_Window *window )
{
fghRedrawWindow ( window ) ;
}
/*
* Closes a window, destroying the frame and OpenGL context
*/