X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=823087b0129be3537273cbf2075a770c2d1bc2ce;hb=13bc069810e3f513a9aa6cd44e8a37d02c7baabf;hp=3982d4b4b26e14ac0037d7d87ba66300bc3e5d31;hpb=5d724da03c1b5988304888c17c5eba8a40c0a529;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 3982d4b..823087b 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -83,12 +83,27 @@ static void fghRedrawWindowByHandle { SFG_Window* window = fgWindowByHandle( handle ); freeglut_return_if_fail( window != NULL ); + + /* + * XXX Other than clearing the Redisplay flag or not, + * XXX we may as well rely on the INVOK_WCB() doing this + * XXX pointer-check. + * XXX + * XXX If we do not invoke the display because the pointer + * XXX is not defined (should never happen, really), then + * XXX we may enter an infinite busy-loop trying to update + * XXX the window. Similarly, if we skip because the window + * XXX is not visible. However, if the window becomes visible + * XXX at a later time, the window should get its callback + * XXX invoked. I would recommend removing the first check, + * XXX and making the second check only affect whether the + * XXX callback is invoked---but always clear the flag, if + * XXX the {window} pointer is defined. + */ freeglut_return_if_fail( FETCH_WCB( *window, Display ) ); freeglut_return_if_fail( window->State.Visible == TRUE ); - /* fgSetWindow( window ); */ window->State.Redisplay = FALSE; - /* window->Callbacks.Display( ); */ INVOKE_WCB( *window, Display, ( ) ); } @@ -109,13 +124,6 @@ static void fghReshapeWindowByHandle SFG_Window* window = fgWindowByHandle( handle ); freeglut_return_if_fail( window != NULL ); - /* - * fgSetWindow( window ); - * if( window->Callbacks.Reshape != NULL ) - * window->Callbacks.Reshape( width, height ); - * else - * glViewport( 0, 0, width, height ); - */ if( !( FETCH_WCB( *window, Reshape ) ) ) { fgSetWindow( window ); @@ -143,15 +151,22 @@ static void fghReshapeWindowByHandle static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) { #if TARGET_HOST_UNIX_X11 + /* + * XXX Do we need/want to check the callback pointer here? + * XXX INVOKE_WCB() will check for us. Arguably, the + * XXX Redisplay status flag should be cleared regardless + * XXX of any concern but that {window} is a valid pointer + * XXX (which this function is assuming anyway). + * XXX Especially since old GLUT wouldn't even enter its main + * XXX loop if you didn't have a display callback defined... + */ if( ( FETCH_WCB( *window, Display ) ) && ( window->State.Redisplay == TRUE ) && ( window->State.Visible == TRUE ) ) { SFG_Window *current_window = fgStructure.Window ; - /* fgSetWindow( window ); */ window->State.Redisplay = FALSE; - /* window->Callbacks.Display( ); */ INVOKE_WCB( *window, Display, ( ) ); fgSetWindow( current_window ); } @@ -174,6 +189,9 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) fgSetWindow ( current_window ); } + /* + * XXX See above comment about the Redisplay flag... + */ if( ( FETCH_WCB( *window, Display ) ) && ( window->State.Redisplay == TRUE ) && ( window->State.Visible == TRUE ) ) @@ -490,14 +508,6 @@ void FGAPIENTRY glutMainLoopEvent( void ) switch( event.type ) { - case DestroyNotify: - /* - * This is sent to confirm the XDestroyWindow call. - * XXX WHY is this commented out? Should we re-enable it? - */ - /* fgAddToWindowDestroyList ( window, FALSE ); */ - break; - case ClientMessage: /* * Destroy the window when the WM_DELETE_WINDOW message arrives @@ -511,26 +521,6 @@ void FGAPIENTRY glutMainLoopEvent( void ) } break; - case MapNotify: - case UnmapNotify: - /* - * If we never do anything with this, can we just not ask to - * get these messages? - */ - break; - - case Expose: - /* - * We are too dumb to process partial exposes... - * XXX Well, we could do it. However, it seems to only - * XXX be potentially useful for single-buffered (since - * XXX double-buffered does not respect viewport when we - * XXX do a buffer-swap). - */ - if( event.xexpose.count == 0 ) - fghRedrawWindowByHandle( event.xexpose.window ); - break; - /* * CreateNotify causes a configure-event so that sub-windows are * handled compatibly with GLUT. Otherwise, your sub-windows @@ -553,6 +543,34 @@ void FGAPIENTRY glutMainLoopEvent( void ) ); break; + case DestroyNotify: + /* + * This is sent to confirm the XDestroyWindow call. + * XXX WHY is this commented out? Should we re-enable it? + */ + /* fgAddToWindowDestroyList ( window, FALSE ); */ + break; + + case Expose: + /* + * We are too dumb to process partial exposes... + * XXX Well, we could do it. However, it seems to only + * XXX be potentially useful for single-buffered (since + * XXX double-buffered does not respect viewport when we + * XXX do a buffer-swap). + */ + if( event.xexpose.count == 0 ) + fghRedrawWindowByHandle( event.xexpose.window ); + break; + + case MapNotify: + case UnmapNotify: + /* + * If we never do anything with this, can we just not ask to + * get these messages? + */ + break; + case MappingNotify: /* * Have the client's keyboard knowledge updated (xlib.ps, @@ -601,34 +619,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) break; case EnterNotify: - { - GETWINDOW( xcrossing ); - GETMOUSE( xcrossing ); - /* - * if( window->Callbacks.Entry ) - * { - * fgSetWindow( window ) ; - * window->Callbacks.Entry( GLUT_ENTERED ); - * } - */ - INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); - } - break; - /* XXX Combine EnterNotify and LeaveNotify */ case LeaveNotify: - { GETWINDOW( xcrossing ); GETMOUSE( xcrossing ); - /* - * if( window->Callbacks.Entry ) - * { - * fgSetWindow( window ) ; - * window->Callbacks.Entry( GLUT_LEFT ); - * } - */ - INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); - } - break; + INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ? + GLUT_ENTERED : + GLUT_LEFT ) ); + break; case MotionNotify: { @@ -659,35 +656,11 @@ void FGAPIENTRY glutMainLoopEvent( void ) (event.xmotion.state & Button3Mask) || (event.xmotion.state & Button4Mask) || (event.xmotion.state & Button5Mask) ) - { - /* - * A mouse button was pressed during the movement... - * Is there a motion callback hooked to the window? - */ - /* - * if( window->Callbacks.Motion ) - * { - * fgSetWindow ( window ) ; - * window->Callbacks.Motion( event.xmotion.x, - * event.xmotion.y ); - * } - */ INVOKE_WCB( *window, Motion, ( event.xmotion.x, - event.xmotion.y ) ); - } + event.xmotion.y ) ); else - { - /* - * if( window->Callbacks.Passive ) - * { - * fgSetWindow( window ); - * window->Callbacks.Passive( event.xmotion.x, - * event.xmotion.y ); - * } - */ INVOKE_WCB( *window, Passive, ( event.xmotion.x, - event.xmotion.y ) ); - } + event.xmotion.y ) ); } break; @@ -717,6 +690,10 @@ void FGAPIENTRY glutMainLoopEvent( void ) button = event.xbutton.button - 1; /* + * XXX This comment is replicated in the WIN32 section and + * XXX maybe also in the menu code. Can we move the info + * XXX to one central place and *reference* it from here? + * * Do not execute the application's mouse callback if a menu * is hooked to this button. In that case an appropriate * private call should be generated. @@ -803,8 +780,6 @@ void FGAPIENTRY glutMainLoopEvent( void ) ! FETCH_WCB( *window, MouseWheel ) ) break; - /* fgSetWindow( window ); */ - /* * XXX Why don't we use {window}? Other code here does... */ @@ -815,23 +790,12 @@ void FGAPIENTRY glutMainLoopEvent( void ) * * XXX Use a symbolic constant, *not* "4"! */ - if( ( button < 4 ) || ( ! FETCH_WCB( *window, MouseWheel ) ) ) - { - /* - * if( window->Callbacks.Mouse ) - * fgStructure.Window->Callbacks.Mouse( - * button, - * pressed ? GLUT_DOWN : GLUT_UP, - * event.xbutton.x, - * event.xbutton.y - * ); - */ + if( ( button < 3 ) || ( ! FETCH_WCB( *window, MouseWheel ) ) ) INVOKE_WCB( *window, Mouse, ( button, pressed ? GLUT_DOWN : GLUT_UP, event.xbutton.x, event.xbutton.y ) ); - } else { /* @@ -842,19 +806,15 @@ void FGAPIENTRY glutMainLoopEvent( void ) * XXX since the order and numbering isn't certain * XXX See XFree86 configuration docs (even back in the * XXX 3.x days, and especially with 4.x). + * + * XXX Note that {button} has already been decremeted + * XXX in mapping from X button numbering to GLUT. */ - int wheel_number = (button - 4) / 2; - int direction = (button & 1)*2 - 1; + int wheel_number = (button - 3) / 2; + int direction = -1; + if( button % 2 ) + direction = 1; - /* - * if( pressed ) - * fgStructure.Window->Callbacks.MouseWheel( - * wheel_number, - * direction, - * event.xbutton.x, - * event.xbutton.y - * ); - */ if( pressed ) INVOKE_WCB( *window, MouseWheel, ( wheel_number, direction, @@ -979,6 +939,9 @@ void FGAPIENTRY glutMainLoopEvent( void ) } break; + case ReparentNotify: + break; /* XXX Should disable this event */ + default: fgWarning ("Unknown X event type: %d", event.type); break; @@ -1034,10 +997,6 @@ void FGAPIENTRY glutMainLoop( void ) { SFG_Window *current_window = fgStructure.Window ; - /* - * fgSetWindow( window ); - * window->Callbacks.Visibility ( window->State.Visible ) ; - */ INVOKE_WCB( *window, Visibility, ( window->State.Visible ) ); fgSetWindow( current_window ); } @@ -1244,6 +1203,8 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; case WM_PAINT: + /* Turn on the visibility in case it was turned off somehow */ + window->State.Visible = GL_TRUE; BeginPaint( hWnd, &ps ); fghRedrawWindowByHandle( hWnd ); EndPaint( hWnd, &ps ); @@ -1307,31 +1268,11 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( ( wParam & MK_LBUTTON ) || ( wParam & MK_MBUTTON ) || ( wParam & MK_RBUTTON ) ) - { - /* - * if( window->Callbacks.Motion ) - * { - * fgSetWindow( window ); - * window->Callbacks.Motion( window->State.MouseX, - * window->State.MouseY ); - * } - */ INVOKE_WCB( *window, Motion, ( window->State.MouseX, window->State.MouseY ) ); - } else - { - /* - * if( window->Callbacks.Passive ) - * { - * fgSetWindow( window ); - * window->Callbacks.Passive( window->State.MouseX, - * window->State.MouseY ); - * } - */ INVOKE_WCB( *window, Passive, ( window->State.MouseX, window->State.MouseY ) ); - } window->State.Modifiers = 0xffffffff; } @@ -1457,14 +1398,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, window->State.MouseY ) ); - /* - * window->Callbacks.Mouse( - * button, - * pressed == TRUE ? GLUT_DOWN : GLUT_UP, - * window->State.MouseX, - * window->State.MouseY - * ); - */ fgStructure.Window->State.Modifiers = 0xffffffff; } @@ -1475,7 +1408,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, { int wheel_number = LOWORD( wParam ); /* THIS IS SPECULATIVE -- John Fay, 10/2/03 */ - short ticks = HIWORD( lParam ) / 120; + short ticks = ( short )HIWORD( wParam ) / 120; /* Should be WHEEL_DELTA instead of 120 */ int direction = 1; @@ -1502,7 +1435,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, while( ticks-- ) if( FETCH_WCB( *window, MouseWheel ) ) - { INVOKE_WCB( *window, MouseWheel, ( wheel_number, direction, @@ -1510,16 +1442,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, window->State.MouseY ) ); - } - /* - * if( window->Callbacks.MouseWheel ) - * window->Callbacks.MouseWheel( - * wheel_number, - * direction, - * window->State.MouseX, - * window->State.MouseY - * ); - */ else /* No mouse wheel, call the mouse button callback twice */ { /* @@ -1537,17 +1459,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, ( button, GLUT_UP, window->State.MouseX, window->State.MouseX ) ); - - /* - * window->Callbacks.Mouse( button, GLUT_DOWN, - * window->State.MouseX, - * window->State.MouseY - * ); - * window->Callbacks.Mouse( button, GLUT_UP, - * window->State.MouseX, - * window->State.MouseY - * ); - */ } fgStructure.Window->State.Modifiers = 0xffffffff; @@ -1608,29 +1519,15 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* * The delete key should be treated as an ASCII keypress: */ - /* - * if( window->Callbacks.Keyboard ) - * { - * fgSetWindow( window ); - * window->Callbacks.Keyboard( 127, window->State.MouseX, - * window->State.MouseY ); - * } - */ INVOKE_WCB( *window, Keyboard, ( 127, window->State.MouseX, window->State.MouseY ) ); } - /* if( ( keypress != -1 ) && window->Callbacks.Special ) - * { - * fgSetWindow( window ); - * window->Callbacks.Special( keypress, window->State.MouseX, - * window->State.MouseY ); - * } - */ if( keypress != -1 ) INVOKE_WCB( *window, Special, - ( keypress, window->State.MouseX, window->State.MouseY ) + ( keypress, + window->State.MouseX, window->State.MouseY ) ); window->State.Modifiers = 0xffffffff; @@ -1688,13 +1585,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* * The delete key should be treated as an ASCII keypress: */ - /* if( window->Callbacks.KeyboardUp ) - * { - * fgSetWindow( window ); - * window->Callbacks.KeyboardUp( 127, window->State.MouseX, - * window->State.MouseY ); - * } - */ INVOKE_WCB( *window, KeyboardUp, ( 127, window->State.MouseX, window->State.MouseY ) ); @@ -1710,15 +1600,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( ToAscii( wParam, 0, state, code, 0 ) == 1 ) wParam=code[ 0 ]; - /* - * if( window->Callbacks.KeyboardUp ) - * { - * fgSetWindow( window ); - * window->Callbacks.KeyboardUp( (char)wParam, - * window->State.MouseX, - * window->State.MouseY ); - * } - */ INVOKE_WCB( *window, KeyboardUp, ( (char)wParam, window->State.MouseX, window->State.MouseY ) @@ -1726,14 +1607,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, } } - /* - * if( (keypress != -1) && window->Callbacks.SpecialUp ) - * { - * fgSetWindow( window ); - * window->Callbacks.SpecialUp( keypress, window->State.MouseX, - * window->State.MouseY ); - * } - */ if( keypress != -1 ) INVOKE_WCB( *window, SpecialUp, ( keypress, @@ -1750,12 +1623,15 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( fgState.IgnoreKeyRepeat && (lParam & KF_REPEAT) ) break; + /* + * XXX INVOKE_WCB() takes care of the callback-pointer check. + * XXX We could just uncoditionally find/trash the Modifiers + * XXX and get rid of the "if( ... ) {" and "}". Unconditinal + * XXX code is simpler code. (^& + */ if( FETCH_WCB( *window, Keyboard ) ) { - /* fgSetWindow( window ); */ window->State.Modifiers = fgGetWin32Modifiers( ); - /* window->Callbacks.Keyboard( (char)wParam, window->State.MouseX, - window->State.MouseY ); */ INVOKE_WCB( *window, Keyboard, ( (char)wParam, window->State.MouseX, window->State.MouseY ) @@ -1767,13 +1643,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_CAPTURECHANGED: /* User has finished resizing the window, force a redraw */ - /* - * if( window->Callbacks.Display ) - * { - * fgSetWindow( window ); - * window->Callbacks.Display( ); - * } - */ INVOKE_WCB( *window, Display, ( ) ); /*lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ) ; */ @@ -1818,6 +1687,75 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* Pass it on to "DefWindowProc" to repaint a standard border */ break; + case WM_SYSCOMMAND : /* 0x0112 */ + { + /* + * We have received a system command message. Try to act on it. + * The commands are passed in through the "lParam" parameter: + * Clicking on a corner to resize the window gives a "F004" message + * but this is not defined in my header file. + */ + switch ( lParam ) + { + case SC_SIZE : + break ; + + case SC_MOVE : + break ; + + case SC_MINIMIZE : + /* User has clicked on the "-" to minimize the window */ + /* Turn off the visibility */ + window->State.Visible = GL_FALSE ; + + break ; + + case SC_MAXIMIZE : + break ; + + case SC_NEXTWINDOW : + break ; + + case SC_PREVWINDOW : + break ; + + case SC_CLOSE : + /* Followed very closely by a WM_CLOSE message */ + break ; + + case SC_VSCROLL : + break ; + + case SC_HSCROLL : + break ; + + case SC_MOUSEMENU : + break ; + + case SC_KEYMENU : + break ; + + case SC_ARRANGE : + break ; + + case SC_RESTORE : + break ; + + case SC_TASKLIST : + break ; + + case SC_SCREENSAVE : + break ; + + case SC_HOTKEY : + break ; + } + } + + /* We need to pass the message on to the operating system as well */ + lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); + break; + default: /* * Handle unhandled messages