From 2272bd5a70b8bac63e1535fee6257cc4595f36e7 Mon Sep 17 00:00:00 2001 From: Diederick Niehorster Date: Fri, 23 Nov 2012 07:41:39 +0000 Subject: [PATCH] implemented position callback on windows and some other minor edits git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1477 7f0cb862-5218-0410-a997-914c9d46530a --- progs/demos/CallbackMaker/CallbackMaker.c | 2 +- progs/demos/Resizer/Resizer.cpp | 23 +++++++++++++++-------- src/fg_ext.c | 1 + src/mswin/fg_main_mswin.c | 11 +++++++++++ src/mswin/fg_state_mswin.c | 6 ++---- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/progs/demos/CallbackMaker/CallbackMaker.c b/progs/demos/CallbackMaker/CallbackMaker.c index ec93516..5027ca5 100644 --- a/progs/demos/CallbackMaker/CallbackMaker.c +++ b/progs/demos/CallbackMaker/CallbackMaker.c @@ -207,7 +207,7 @@ Position(int left, int top) { int winIdx; int window = getWindowAndIdx(&winIdx); - printf ( "%6d Window %d Reshape Callback: %d %d\n", + printf ( "%6d Window %d Position Callback: %d %d\n", ++sequence_number, window, left, top ) ; position_called[winIdx] = 1 ; position_left[winIdx] = left ; diff --git a/progs/demos/Resizer/Resizer.cpp b/progs/demos/Resizer/Resizer.cpp index 60d76fe..58c0552 100644 --- a/progs/demos/Resizer/Resizer.cpp +++ b/progs/demos/Resizer/Resizer.cpp @@ -141,29 +141,35 @@ void Idle(void) glutPostRedisplay(); } -void Reshape(int x, int y) +void Reshape(int width, int height) { int win = glutGetWindow(); - nWidth = glutGet(GLUT_WINDOW_WIDTH); - nHeight = glutGet(GLUT_WINDOW_HEIGHT); printf("reshape %s, %dx%d\n",win==nWindow?"main":"child", - nWidth, nHeight); + width, height); - glViewport(0,0,nWidth,nHeight); + glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluOrtho2D(0,nWidth,0,nHeight); + gluOrtho2D(0,width,0,height); if (win==nWindow && nChildWindow!=-1) { glutSetWindow(nChildWindow); - glutPositionWindow((int)(nWidth*.35),(int)(nHeight*.35)); - glutReshapeWindow((int)(nWidth*.3),(int)(nHeight*.3)); + glutPositionWindow((int)(width*.35),(int)(height*.35)); + glutReshapeWindow((int)(width*.3),(int)(height*.3)); glutSetWindow(nWindow); } } +void Position(int x, int y) +{ + int win = glutGetWindow(); + + printf("position %s, %dx%d\n",win==nWindow?"main":"child", + x, y); +} + void Redisplay(void) { int win = glutGetWindow(); @@ -246,6 +252,7 @@ int main(int argc, char* argv[]) glutKeyboardFunc( SampleKeyboard ); glutDisplayFunc( Redisplay ); glutReshapeFunc( Reshape ); + glutPositionFunc( Position ); glutMainLoop(); printf("glutMainLoop returned\n"); diff --git a/src/fg_ext.c b/src/fg_ext.c index beadca3..6e1784b 100644 --- a/src/fg_ext.c +++ b/src/fg_ext.c @@ -86,6 +86,7 @@ static GLUTproc fghGetGLUTProcAddress( const char* procName ) CHECK_NAME(glutDetachMenu); CHECK_NAME(glutDisplayFunc); CHECK_NAME(glutReshapeFunc); + CHECK_NAME(glutPositionFunc); CHECK_NAME(glutKeyboardFunc); CHECK_NAME(glutMouseFunc); CHECK_NAME(glutMultiEntryFunc); diff --git a/src/mswin/fg_main_mswin.c b/src/mswin/fg_main_mswin.c index 59b2530..981acad 100644 --- a/src/mswin/fg_main_mswin.c +++ b/src/mswin/fg_main_mswin.c @@ -427,6 +427,17 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; + case WM_MOVE: + { + SFG_Window* saved_window = fgStructure.CurrentWindow; + RECT windowRect; + GetWindowRect( window->Window.Handle, &windowRect ); + + INVOKE_WCB( *window, Position, ( windowRect.left, windowRect.top ) ); + fgSetWindow(saved_window); + } + break; + case WM_SETFOCUS: /* printf("WM_SETFOCUS: %p\n", window ); */ diff --git a/src/mswin/fg_state_mswin.c b/src/mswin/fg_state_mswin.c index 9df5211..bea609e 100644 --- a/src/mswin/fg_state_mswin.c +++ b/src/mswin/fg_state_mswin.c @@ -187,11 +187,9 @@ int fgPlatformGlutGet ( GLenum eWhat ) if (fgStructure.CurrentWindow->Parent && (eWhat==GLUT_WINDOW_X || eWhat==GLUT_WINDOW_Y)) { /* For child window, we should return relative to upper-left - * of parent's client area. + * of parent's client area. */ - POINT topleft; - topleft.x = winRect.left; - topleft.y = winRect.top; + POINT topleft = {winRect.left,winRect.top}; ScreenToClient(fgStructure.CurrentWindow->Parent->Window.Handle,&topleft); winRect.left = topleft.x; -- 1.7.10.4