X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=c57547c2f3f1db6cabfefb5f5fb34b8ff9079542;hb=b1e6158f2fffaf8fc807615e8478b3b45d5915a2;hp=d934ccc88118d91ad52557b3aea1e7d46ec13831;hpb=c926b36b4ed32b63b3dc5c50f4b98588fd23f0de;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index d934ccc..c57547c 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -90,7 +90,7 @@ static void fghRedrawWindowByHandle fgSetWindow( window ); window->State.Redisplay = FALSE; - window->Callbacks.Display(); + window->Callbacks.Display( ); } /* @@ -105,7 +105,7 @@ static void fghReshapeWindowByHandle ( HWND handle, int width, int height ) #endif { - SFG_Window *current_window = fgStructure.Window ; + SFG_Window *current_window = fgStructure.Window; SFG_Window* window = fgWindowByHandle( handle ); freeglut_return_if_fail( window != NULL ); @@ -123,10 +123,10 @@ static void fghReshapeWindowByHandle * But without this we get this bad behaviour whenever we resize the * window. */ - window->State.Redisplay = TRUE ; + window->State.Redisplay = TRUE; if( window->IsMenu ) - fgSetWindow( current_window ) ; + fgSetWindow( current_window ); } /* @@ -143,15 +143,15 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) fgSetWindow( window ); window->State.Redisplay = FALSE; - window->Callbacks.Display(); - fgSetWindow( current_window ) ; + window->Callbacks.Display( ); + fgSetWindow( current_window ); } #elif TARGET_HOST_WIN32 if( window->State.NeedToResize ) { - SFG_Window *current_window = fgStructure.Window ; + SFG_Window *current_window = fgStructure.Window; fgSetWindow( window ); @@ -162,7 +162,7 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) ); window->State.NeedToResize = FALSE; - fgSetWindow ( current_window ) ; + fgSetWindow ( current_window ); } if( (window->Callbacks.Display != NULL) && @@ -201,7 +201,7 @@ static void fghDisplayAll( void ) static void fghcbCheckJoystickPolls( SFG_Window *window, SFG_Enumerator *enumerator ) { - long int checkTime = fgElapsedTime(); + long int checkTime = fgElapsedTime( ); if( window->State.JoystickLastPoll + window->State.JoystickPollRate <= checkTime ) @@ -231,7 +231,7 @@ static void fghCheckJoystickPolls( void ) */ static void fghCheckTimers( void ) { - long checkTime = fgElapsedTime(); + long checkTime = fgElapsedTime( ); SFG_Timer *timer, *next; SFG_List timedOut; @@ -278,9 +278,9 @@ long fgElapsedTime( void ) elapsed = (now.tv_usec - fgState.Time.Value.tv_usec) / 1000; elapsed += (now.tv_sec - fgState.Time.Value.tv_sec) * 1000; - return( elapsed ); + return elapsed; #elif TARGET_HOST_WIN32 - return (timeGetTime() - fgState.Time.Value); + return timeGetTime() - fgState.Time.Value; #endif } @@ -409,15 +409,14 @@ static void fgSleepForEvents( void ) struct timeval wait; long msec; - if( fgState.IdleCallback || - fgHavePendingRedisplays() ) + if( fgState.IdleCallback || fgHavePendingRedisplays( ) ) return; socket = ConnectionNumber( fgDisplay.Display ); FD_ZERO( &fdset ); FD_SET( socket, &fdset ); - msec = fgNextTimer(); - if( fgHaveJoystick() ) + msec = fgNextTimer( ); + if( fgHaveJoystick( ) ) msec = MIN( msec, 10 ); wait.tv_sec = msec / 1000; @@ -431,6 +430,26 @@ static void fgSleepForEvents( void ) #endif } +#if TARGET_HOST_UNIX_X11 +/* + * Returns GLUT modifier mask for an XEvent. + */ +int fgGetXModifiers( XEvent *event ) +{ + int ret = 0; + + if( event->xkey.state & ( ShiftMask | LockMask ) ) + ret |= GLUT_ACTIVE_SHIFT; + if( event->xkey.state & ControlMask ) + ret |= GLUT_ACTIVE_CTRL; + if( event->xkey.state & Mod1Mask ) + ret |= GLUT_ACTIVE_ALT; + + return ret; +} +#endif + + /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ /* @@ -441,7 +460,6 @@ void FGAPIENTRY glutMainLoopEvent( void ) #if TARGET_HOST_UNIX_X11 SFG_Window* window; XEvent event; - int modifiers; /* * This code was repeated constantly, so here it goes into a definition: @@ -759,14 +777,10 @@ void FGAPIENTRY glutMainLoopEvent( void ) fgSetWindow( window ); - modifiers = 0; - if( event.xbutton.state & ( ShiftMask | LockMask ) ) - modifiers |= GLUT_ACTIVE_SHIFT; - if( event.xbutton.state & ControlMask ) - modifiers |= GLUT_ACTIVE_CTRL; - if( event.xbutton.state & Mod1Mask ) - modifiers |= GLUT_ACTIVE_ALT; - fgStructure.Window->State.Modifiers = modifiers; + /* + * XXX Why don't we use {window}? Other code here does... + */ + fgStructure.Window->State.Modifiers = fgGetXModifiers( &event ); /* * Finally execute the mouse or mouse wheel callback @@ -863,25 +877,9 @@ void FGAPIENTRY glutMainLoopEvent( void ) if( keyboard_cb ) { fgSetWindow( window ); - - /* - * Remember the current modifiers state - */ - modifiers = 0; - if( event.xkey.state & ( ShiftMask | LockMask ) ) - modifiers |= GLUT_ACTIVE_SHIFT; - if( event.xkey.state & ControlMask ) - modifiers |= GLUT_ACTIVE_CTRL; - if( event.xkey.state & Mod1Mask ) - modifiers |= GLUT_ACTIVE_ALT; - window->State.Modifiers = modifiers; - + window->State.Modifiers = fgGetXModifiers( &event ); keyboard_cb( asciiCode[ 0 ], event.xkey.x, event.xkey.y ); - - /* - * Trash the modifiers state - */ window->State.Modifiers = 0xffffffff; } } @@ -932,24 +930,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) if( special_cb && (special != -1) ) { fgSetWindow( window ); - - /* - * Remember the current modifiers state - */ - modifiers = 0; - if( event.xkey.state & ( ShiftMask | LockMask ) ) - modifiers |= GLUT_ACTIVE_SHIFT; - if( event.xkey.state & ControlMask ) - modifiers |= GLUT_ACTIVE_CTRL; - if( event.xkey.state & Mod1Mask ) - modifiers |= GLUT_ACTIVE_ALT; - window->State.Modifiers = modifiers; - + window->State.Modifiers = fgGetXModifiers( &event ); special_cb( special, event.xkey.x, event.xkey.y ); - - /* - * Trash the modifiers state - */ window->State.Modifiers = 0xffffffff; } } @@ -1059,10 +1041,25 @@ void FGAPIENTRY glutLeaveMainLoop( void ) fgState.ExecState = GLUT_EXEC_STATE_STOP ; } + +#if TARGET_HOST_WIN32 +/* + * Determine a GLUT modifer mask based on MS-WINDOWS system info. + */ +int fgGetWin32Modifiers (void) +{ + return + ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || + ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | + ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || + ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | + ( ( ( GetKeyState( VK_LMENU ) < 0 ) || + ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); +} + /* * The window procedure for handling Win32 events */ -#if TARGET_HOST_WIN32 LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { @@ -1088,24 +1085,24 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, window->Window.Device = GetDC( hWnd ); if( fgState.BuildingAMenu ) { - unsigned int current_DisplayMode = fgState.DisplayMode; - fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH; - fgSetupPixelFormat( window, FALSE, PFD_MAIN_PLANE ); - fgState.DisplayMode = current_DisplayMode; - - if( fgStructure.MenuContext ) - wglMakeCurrent( window->Window.Device, - fgStructure.MenuContext->Context ) ; - else - { - fgStructure.MenuContext = - (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); - fgStructure.MenuContext->Context = - wglCreateContext( window->Window.Device ); - } - - /* window->Window.Context = wglGetCurrentContext () ; */ - window->Window.Context = wglCreateContext( window->Window.Device ); + unsigned int current_DisplayMode = fgState.DisplayMode; + fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH; + fgSetupPixelFormat( window, FALSE, PFD_MAIN_PLANE ); + fgState.DisplayMode = current_DisplayMode; + + if( fgStructure.MenuContext ) + wglMakeCurrent( window->Window.Device, + fgStructure.MenuContext->Context ) ; + else + { + fgStructure.MenuContext = + (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); + fgStructure.MenuContext->Context = + wglCreateContext( window->Window.Device ); + } + + /* window->Window.Context = wglGetCurrentContext () ; */ + window->Window.Context = wglCreateContext( window->Window.Device ); } else { @@ -1145,7 +1142,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* glutSetCursor( fgStructure.Window->State.Cursor ); */ printf("WM_ACTIVATE: glutSetCursor( %p, %d)\n", window, window->State.Cursor ); - glutSetCursor( window->State.Cursor ); } @@ -1162,32 +1158,38 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, (fgStructure.Window->State.Cursor == GLUT_CURSOR_NONE)) SetCursor( NULL ); #else + /* Set the cursor AND change it for this window class. */ -# define MAP_CURSOR(a,b) case a: SetCursor( LoadCursor( NULL, b ) ); \ - break; +#define MAP_CURSOR(a,b) \ + case a: \ + SetCursor( LoadCursor( NULL, b ) ); \ + break; + /* Nuke the cursor AND change it for this window class. */ -# define ZAP_CURSOR(a,b) case a: SetCursor( NULL ); \ - break; +#define ZAP_CURSOR(a,b) \ + case a: \ + SetCursor( NULL ); \ + break; if( LOWORD( lParam ) == HTCLIENT ) - switch( window->State.Cursor ) - { - MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, IDC_ARROW ); - MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, IDC_ARROW ); - MAP_CURSOR( GLUT_CURSOR_INFO, IDC_HELP ); - MAP_CURSOR( GLUT_CURSOR_DESTROY, IDC_CROSS ); - MAP_CURSOR( GLUT_CURSOR_HELP, IDC_HELP ); - MAP_CURSOR( GLUT_CURSOR_CYCLE, IDC_SIZEALL ); - MAP_CURSOR( GLUT_CURSOR_SPRAY, IDC_CROSS ); - MAP_CURSOR( GLUT_CURSOR_WAIT, IDC_WAIT ); - MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_UPARROW ); - MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS ); - /* MAP_CURSOR( GLUT_CURSOR_NONE, IDC_NO ); */ - ZAP_CURSOR( GLUT_CURSOR_NONE, NULL ); - - default: - MAP_CURSOR( GLUT_CURSOR_UP_DOWN, IDC_ARROW ); - } + switch( window->State.Cursor ) + { + MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, IDC_ARROW ); + MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, IDC_ARROW ); + MAP_CURSOR( GLUT_CURSOR_INFO, IDC_HELP ); + MAP_CURSOR( GLUT_CURSOR_DESTROY, IDC_CROSS ); + MAP_CURSOR( GLUT_CURSOR_HELP, IDC_HELP ); + MAP_CURSOR( GLUT_CURSOR_CYCLE, IDC_SIZEALL ); + MAP_CURSOR( GLUT_CURSOR_SPRAY, IDC_CROSS ); + MAP_CURSOR( GLUT_CURSOR_WAIT, IDC_WAIT ); + MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_UPARROW ); + MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS ); + /* MAP_CURSOR( GLUT_CURSOR_NONE, IDC_NO ); */ + ZAP_CURSOR( GLUT_CURSOR_NONE, NULL ); + + default: + MAP_CURSOR( GLUT_CURSOR_UP_DOWN, IDC_ARROW ); + } #endif else lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); @@ -1235,7 +1237,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, * Put on a linked list of windows to be removed after all the * callbacks have returned */ - fgAddToWindowDestroyList( window, FALSE ) ; + fgAddToWindowDestroyList( window, FALSE ); DestroyWindow( hWnd ); break; @@ -1243,7 +1245,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* * The window already got destroyed, so don't bother with it. */ - return( 0 ); + return 0; case WM_MOUSEMOVE: { @@ -1252,23 +1254,12 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( window->ActiveMenu ) { - window->State.Redisplay = TRUE ; - - /* - * Since the window is a menu, make the parent window current - */ - fgSetWindow ( window->ActiveMenu->ParentWindow ) ; - + window->State.Redisplay = TRUE; + fgSetWindow ( window->ActiveMenu->ParentWindow ); break; } - window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); + window->State.Modifiers = fgGetWin32Modifiers( ); if( ( wParam & MK_LBUTTON ) || ( wParam & MK_MBUTTON ) || @@ -1405,14 +1396,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; fgSetWindow( window ); - - fgStructure.Window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); + fgStructure.Window->State.Modifiers = fgGetWin32Modifiers( ); window->Callbacks.Mouse( button, @@ -1453,13 +1437,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; fgSetWindow( window ); - fgStructure.Window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); + fgStructure.Window->State.Modifiers = fgGetWin32Modifiers( ); while( ticks-- ) if( window->Callbacks.MouseWheel ) @@ -1476,13 +1454,16 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, * XXX buttons. Sorry. */ int button = wheel_number*2 + 4; - button += (1 + direction)/2; + if( direction > 0 ) + ++button; window->Callbacks.Mouse( button, GLUT_DOWN, window->State.MouseX, - window->State.MouseY ) ; + window->State.MouseY + ); window->Callbacks.Mouse( button, GLUT_UP, window->State.MouseX, - window->State.MouseY ) ; + window->State.MouseY + ); } fgStructure.Window->State.Modifiers = 0xffffffff; @@ -1502,13 +1483,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ - window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); + window->State.Modifiers = fgGetWin32Modifiers( ); GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); @@ -1572,19 +1547,13 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_KEYUP: { int keypress = -1; - POINT mouse_pos ; + POINT mouse_pos; /* * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ - window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); + window->State.Modifiers = fgGetWin32Modifiers( ); GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); @@ -1674,14 +1643,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( window->Callbacks.Keyboard ) { fgSetWindow( window ); - window->State.Modifiers = - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); - + window->State.Modifiers = fgGetWin32Modifiers( ); window->Callbacks.Keyboard( (char)wParam, window->State.MouseX, window->State.MouseY ); window->State.Modifiers = 0xffffffff; @@ -1694,7 +1656,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( window->Callbacks.Display ) { fgSetWindow( window ); - window->Callbacks.Display( ); } @@ -1748,7 +1709,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; } - return lRet ; + return lRet; } #endif