From: <fa...@us...> - 2012-06-09 19:43:50
|
Revision: 1338 http://freeglut.svn.sourceforge.net/freeglut/?rev=1338&view=rev Author: fayjf Date: 2012-06-09 19:43:44 +0000 (Sat, 09 Jun 2012) Log Message: ----------- Fixing the warning message when "glutGetModifiers" is called from within the special key callback; also removing some unused key codes in the special key processing code. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-09 18:02:53 UTC (rev 1337) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-09 19:43:44 UTC (rev 1338) @@ -241,6 +241,8 @@ if ( window ) { + fgState.Modifiers = fgPlatformGetModifiers( ); + /* Checking for CTRL, ALT, and SHIFT key positions: Key Down! */ if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) ) { @@ -350,6 +352,8 @@ rAlt = 0; } + + fgState.Modifiers = INVALID_MODIFIERS; } switch( uMsg ) @@ -789,12 +793,6 @@ KEY( VK_RIGHT, GLUT_KEY_RIGHT ); KEY( VK_DOWN, GLUT_KEY_DOWN ); KEY( VK_INSERT, GLUT_KEY_INSERT ); - KEY( VK_LCONTROL, GLUT_KEY_CTRL_L ); - KEY( VK_RCONTROL, GLUT_KEY_CTRL_R ); - KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L ); - KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R ); - KEY( VK_LMENU, GLUT_KEY_ALT_L ); - KEY( VK_RMENU, GLUT_KEY_ALT_R ); case VK_DELETE: /* The delete key should be treated as an ASCII keypress: */ @@ -881,12 +879,6 @@ KEY( VK_RIGHT, GLUT_KEY_RIGHT ); KEY( VK_DOWN, GLUT_KEY_DOWN ); KEY( VK_INSERT, GLUT_KEY_INSERT ); - KEY( VK_LCONTROL, GLUT_KEY_CTRL_L ); - KEY( VK_RCONTROL, GLUT_KEY_CTRL_R ); - KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L ); - KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R ); - KEY( VK_LMENU, GLUT_KEY_ALT_L ); - KEY( VK_RMENU, GLUT_KEY_ALT_R ); case VK_DELETE: /* The delete key should be treated as an ASCII keypress: */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-06-10 20:41:51
|
Revision: 1341 http://freeglut.svn.sourceforge.net/freeglut/?rev=1341&view=rev Author: fayjf Date: 2012-06-10 20:41:45 +0000 (Sun, 10 Jun 2012) Log Message: ----------- Fixing mouse wheel bug in Windows per e-mail from Ioannis Petikas dated 5/9/12 at 1:02 PM. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-10 19:35:13 UTC (rev 1340) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-10 20:41:45 UTC (rev 1341) @@ -689,7 +689,7 @@ /* * XXX Should use WHEEL_DELTA instead of 120 */ - if ( abs ( fgState.MouseWheelTicks ) > 120 ) + if ( abs ( fgState.MouseWheelTicks ) >= 120 ) { int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; @@ -703,7 +703,7 @@ /* * XXX Should use WHEEL_DELTA instead of 120 */ - while( abs ( fgState.MouseWheelTicks ) > 120 ) + while( abs ( fgState.MouseWheelTicks ) >= 120 ) { if( FETCH_WCB( *window, MouseWheel ) ) INVOKE_WCB( *window, MouseWheel, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fa...@us...> - 2012-06-10 19:35:19
|
Revision: 1340 http://freeglut.svn.sourceforge.net/freeglut/?rev=1340&view=rev Author: fayjf Date: 2012-06-10 19:35:13 +0000 (Sun, 10 Jun 2012) Log Message: ----------- Fixing the situation in which the special-key-up callback is called twice when Ctrl, Alt, or Shift is released. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-10 09:06:45 UTC (rev 1339) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-10 19:35:13 UTC (rev 1340) @@ -794,6 +794,12 @@ KEY( VK_DOWN, GLUT_KEY_DOWN ); KEY( VK_INSERT, GLUT_KEY_INSERT ); + case VK_LCONTROL: case VK_RCONTROL: case VK_CONTROL: + case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: + case VK_LMENU: case VK_RMENU: case VK_MENU: + /* These keypresses and releases are handled earlier in the function */ + break; + case VK_DELETE: /* The delete key should be treated as an ASCII keypress: */ INVOKE_WCB( *window, Keyboard, @@ -880,6 +886,12 @@ KEY( VK_DOWN, GLUT_KEY_DOWN ); KEY( VK_INSERT, GLUT_KEY_INSERT ); + case VK_LCONTROL: case VK_RCONTROL: case VK_CONTROL: + case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: + case VK_LMENU: case VK_RMENU: case VK_MENU: + /* These keypresses and releases are handled earlier in the function */ + break; + case VK_DELETE: /* The delete key should be treated as an ASCII keypress: */ INVOKE_WCB( *window, KeyboardUp, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-20 05:44:11
|
Revision: 1347 http://freeglut.svn.sourceforge.net/freeglut/?rev=1347&view=rev Author: dcnieho Date: 2012-07-20 05:44:05 +0000 (Fri, 20 Jul 2012) Log Message: ----------- it was in 2003 that his compiler didn't recognize this symbol, lets assume its fine by now on anything we support Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-06-18 06:14:32 UTC (rev 1346) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 05:44:05 UTC (rev 1347) @@ -679,8 +679,7 @@ } break; - case 0x020a: - /* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */ + case WM_MOUSEWHEEL: { int wheel_number = LOWORD( wParam ); short ticks = ( short )HIWORD( wParam ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-20 06:35:44
|
Revision: 1348 http://freeglut.svn.sourceforge.net/freeglut/?rev=1348&view=rev Author: dcnieho Date: 2012-07-20 06:35:38 +0000 (Fri, 20 Jul 2012) Log Message: ----------- removed SetFocus that was added to WM_MOUSEMOVE to handle keyboard focus with subwindows Now using a solution similar to GLUT's, when receiving input, check if mouse is actually on a child of the window passed in by the event, and process as if event was on that window instead Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 05:44:05 UTC (rev 1347) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 06:35:38 UTC (rev 1348) @@ -239,6 +239,21 @@ /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, uMsg, wParam, lParam ); */ + /* events only sent to main window. Check if the current window that the mouse + is over is a child window and if so, make sure we call the callback on that + child instead. + */ + if (window && window->Children.First) + { + POINT mouse_pos; + SFG_WindowHandleType hwnd; + + GetCursorPos( &mouse_pos ); + ScreenToClient( window->Window.Handle, &mouse_pos ); + hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); + window = fgWindowByHandle(hwnd); + } + if ( window ) { fgState.Modifiers = fgPlatformGetModifiers( ); @@ -552,7 +567,6 @@ fgUpdateMenuHighlight( window->ActiveMenu ); break; } - SetFocus(window->Window.Handle); fgState.Modifiers = fgPlatformGetModifiers( ); @@ -751,6 +765,7 @@ int keypress = -1; POINT mouse_pos ; + if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-20 06:48:11
|
Revision: 1349 http://freeglut.svn.sourceforge.net/freeglut/?rev=1349&view=rev Author: dcnieho Date: 2012-07-20 06:48:05 +0000 (Fri, 20 Jul 2012) Log Message: ----------- need to check for NULL as well.... Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 06:35:38 UTC (rev 1348) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 06:48:05 UTC (rev 1349) @@ -251,7 +251,8 @@ GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); - window = fgWindowByHandle(hwnd); + if (hwnd) /* can be NULL if mouse outside parent by the time we get here */ + window = fgWindowByHandle(hwnd); } if ( window ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-20 08:08:02
|
Revision: 1350 http://freeglut.svn.sourceforge.net/freeglut/?rev=1350&view=rev Author: dcnieho Date: 2012-07-20 08:07:52 +0000 (Fri, 20 Jul 2012) Log Message: ----------- small addition to debug msg handy for testing Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 06:48:05 UTC (rev 1349) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-20 08:07:52 UTC (rev 1350) @@ -493,7 +493,7 @@ break; case WM_KILLFOCUS: -/* printf("WM_KILLFOCUS: %p\n", window ); */ +/* printf("WM_KILLFOCUS (ismenu: %i): %p\n", window->IsMenu, window ); */ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-21 03:12:03
|
Revision: 1352 http://freeglut.svn.sourceforge.net/freeglut/?rev=1352&view=rev Author: dcnieho Date: 2012-07-21 03:11:57 +0000 (Sat, 21 Jul 2012) Log Message: ----------- fixes two cases of menu's not closing when they should: 1. open a menu in one of the freeglut windows, then activate another app (or the console window) by clicking on that. The freeglut menu doesn't close, and as it is topmost, it shines through everything. 2. open a menu in one of the freeglut windows, then click on the non-client area of another freeglut window (e.g. the title bar): menu doesn't close Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 02:32:58 UTC (rev 1351) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 03:11:57 UTC (rev 1352) @@ -497,10 +497,30 @@ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); + /* If this is a menu that lost focus, see if user either switched + application or FreeGLUT window (if one is running multiple + windows). If so, close menu that lost focus. + */ if( window->IsMenu && window->ActiveMenu && window->ActiveMenu->IsActive ) - fgUpdateMenuHighlight( window->ActiveMenu ); + { + SFG_Window* wnd = NULL; + HWND hwnd = GetForegroundWindow(); /* Get window with current focus */ + if (hwnd) + /* See if its one of our windows */ + wnd = fgWindowByHandle(hwnd); + if (!hwnd || !wnd) + /* User switched to another application*/ + fgDeactivateMenu(window->ActiveMenu->ParentWindow); + else if ( + ( wnd->IsMenu && wnd->ActiveMenu->ParentWindow!=window->ActiveMenu->ParentWindow) || /* Make sure we don't kill the menu when trying to enter a submenu */ + (!wnd->IsMenu && wnd!=window->ActiveMenu->ParentWindow) + ) + /* User switched to another FreeGLUT window */ + fgDeactivateMenu(window->ActiveMenu->ParentWindow); + } + break; #if 0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-21 14:18:19
|
Revision: 1356 http://freeglut.svn.sourceforge.net/freeglut/?rev=1356&view=rev Author: dcnieho Date: 2012-07-21 14:18:13 +0000 (Sat, 21 Jul 2012) Log Message: ----------- some clean up in WM_KILLFOCUS handler Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 14:15:39 UTC (rev 1355) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 14:18:13 UTC (rev 1356) @@ -495,7 +495,7 @@ case WM_KILLFOCUS: { SFG_Menu* menu = NULL; -/* printf("WM_KILLFOCUS (ismenu: %i): %p\n", window->IsMenu, window ); */ + printf("WM_KILLFOCUS: %p\n", window ); lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); @@ -504,26 +504,41 @@ application or FreeGLUT window (if one is running multiple windows). If so, close menu the active menu. */ - if ( fgStructure.CurrentMenu ) + if ( fgStructure.Menus.First ) menu = fgGetActiveMenu(); if ( menu ) { SFG_Window* wnd = NULL; - HWND hwnd = GetForegroundWindow(); /* Get window with current focus */ + HWND hwnd = GetFocus(); /* Get window with current focus - NULL for non freeglut windows */ + printf(" hwnd: %p\n",hwnd); if (hwnd) - /* See if its one of our windows */ + /* See which of our windows it is */ wnd = fgWindowByHandle(hwnd); + //printf(" got menu: %p\n",menu); + + printf(" wnd: %p, wnd->AM->PW: %p, menu->PW: %p\n",wnd,wnd&&wnd->ActiveMenu?wnd->ActiveMenu->ParentWindow:0,menu->ParentWindow); + if (wnd) + printf(" wnd menu: %i, wnd->ActiveMenu: %p, wnd->Parent: %p\n",wnd->IsMenu,wnd->ActiveMenu,wnd->Parent); + if (!hwnd || !wnd) + { /* User switched to another application*/ fgDeactivateMenu(menu->ParentWindow); - else if ( - ( wnd->IsMenu && wnd->ActiveMenu && wnd->ActiveMenu->ParentWindow!=menu->ParentWindow) || /* Make sure we don't kill the menu when trying to enter a submenu */ - (!wnd->IsMenu && wnd!=menu->ParentWindow) - ) + printf(" -> kill1\n"); + } + else if (!wnd->IsMenu && wnd!=menu->ParentWindow) + { /* User switched to another FreeGLUT window */ fgDeactivateMenu(menu->ParentWindow); + printf(" -> kill2\n"); + + } + else + { + printf(" -> survive\n"); + } } } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-21 14:19:45
|
Revision: 1357 http://freeglut.svn.sourceforge.net/freeglut/?rev=1357&view=rev Author: dcnieho Date: 2012-07-21 14:19:38 +0000 (Sat, 21 Jul 2012) Log Message: ----------- argh, some debug code made it in (don't commit and then make changes to the file before its fully transmitted...) Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 14:18:13 UTC (rev 1356) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-21 14:19:38 UTC (rev 1357) @@ -495,7 +495,7 @@ case WM_KILLFOCUS: { SFG_Menu* menu = NULL; - printf("WM_KILLFOCUS: %p\n", window ); +/* printf("WM_KILLFOCUS: %p\n", window ); */ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); @@ -511,34 +511,16 @@ { SFG_Window* wnd = NULL; HWND hwnd = GetFocus(); /* Get window with current focus - NULL for non freeglut windows */ - printf(" hwnd: %p\n",hwnd); if (hwnd) /* See which of our windows it is */ wnd = fgWindowByHandle(hwnd); - //printf(" got menu: %p\n",menu); - - printf(" wnd: %p, wnd->AM->PW: %p, menu->PW: %p\n",wnd,wnd&&wnd->ActiveMenu?wnd->ActiveMenu->ParentWindow:0,menu->ParentWindow); - if (wnd) - printf(" wnd menu: %i, wnd->ActiveMenu: %p, wnd->Parent: %p\n",wnd->IsMenu,wnd->ActiveMenu,wnd->Parent); - if (!hwnd || !wnd) - { /* User switched to another application*/ fgDeactivateMenu(menu->ParentWindow); - printf(" -> kill1\n"); - } else if (!wnd->IsMenu && wnd!=menu->ParentWindow) - { /* User switched to another FreeGLUT window */ fgDeactivateMenu(menu->ParentWindow); - printf(" -> kill2\n"); - - } - else - { - printf(" -> survive\n"); - } } } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-23 07:04:16
|
Revision: 1362 http://freeglut.svn.sourceforge.net/freeglut/?rev=1362&view=rev Author: dcnieho Date: 2012-07-23 07:04:06 +0000 (Mon, 23 Jul 2012) Log Message: ----------- now also closing menus when non-client area is pressed (thanks for suggestions Ioannis!) Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 07:00:14 UTC (rev 1361) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 07:04:06 UTC (rev 1362) @@ -532,6 +532,18 @@ else if (!wnd->IsMenu && wnd!=menu->ParentWindow) /* Make sure we don't kill the menu when trying to enter a submenu */ /* User switched to another FreeGLUT window */ fgDeactivateMenu(menu->ParentWindow); + else + { + /* Check if focus lost because non-client area of + * window was pressed (pressing on client area is + * handled in fgCheckActiveMenu) + */ + POINT mouse_pos; + RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE); + GetCursorPos(&mouse_pos); + if ( !PtInRect( &clientArea, mouse_pos ) ) + fgDeactivateMenu(menu->ParentWindow); + } } } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-23 09:50:23
|
Revision: 1364 http://freeglut.svn.sourceforge.net/freeglut/?rev=1364&view=rev Author: dcnieho Date: 2012-07-23 09:50:14 +0000 (Mon, 23 Jul 2012) Log Message: ----------- Should only do check if mouse is outside client area when not opening a submenu as well... Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 08:52:50 UTC (rev 1363) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 09:50:14 UTC (rev 1364) @@ -541,20 +541,23 @@ if (!hwnd || !wnd) /* User switched to another application*/ fgDeactivateMenu(menu->ParentWindow); - else if (!wnd->IsMenu && wnd!=menu->ParentWindow) /* Make sure we don't kill the menu when trying to enter a submenu */ - /* User switched to another FreeGLUT window */ - fgDeactivateMenu(menu->ParentWindow); - else + else if (!wnd->IsMenu) /* Make sure we don't kill the menu when trying to enter a submenu */ { - /* Check if focus lost because non-client area of - * window was pressed (pressing on client area is - * handled in fgCheckActiveMenu) - */ - POINT mouse_pos; - RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE); - GetCursorPos(&mouse_pos); - if ( !PtInRect( &clientArea, mouse_pos ) ) + if (wnd!=menu->ParentWindow) + /* User switched to another FreeGLUT window */ fgDeactivateMenu(menu->ParentWindow); + else + { + /* Check if focus lost because non-client area of + * window was pressed (pressing on client area is + * handled in fgCheckActiveMenu) + */ + POINT mouse_pos; + RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE); + GetCursorPos(&mouse_pos); + if ( !PtInRect( &clientArea, mouse_pos ) ) + fgDeactivateMenu(menu->ParentWindow); + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-07-23 09:51:43
|
Revision: 1365 http://freeglut.svn.sourceforge.net/freeglut/?rev=1365&view=rev Author: dcnieho Date: 2012-07-23 09:51:34 +0000 (Mon, 23 Jul 2012) Log Message: ----------- now added fix suggested by Ioannis to make menus work when an entryfunc is defined for the window Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 09:50:14 UTC (rev 1364) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-07-23 09:51:34 UTC (rev 1365) @@ -518,9 +518,11 @@ case WM_KILLFOCUS: { SFG_Menu* menu = NULL; + SFG_Window* saved_window = fgStructure.CurrentWindow; /* printf("WM_KILLFOCUS: %p\n", window ); */ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); + fgSetWindow(saved_window); /* If we have an open menu, see if the open menu should be closed * when focus was lost because user either switched This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-08-06 15:05:19
|
Revision: 1384 http://freeglut.svn.sourceforge.net/freeglut/?rev=1384&view=rev Author: dcnieho Date: 2012-08-06 15:05:10 +0000 (Mon, 06 Aug 2012) Log Message: ----------- also add an InvalidateRect call before the BeginPaint in WM_PAINT handler.this ensures the whole window is repainted, and hopefully fixes some bug reports. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-08-06 15:03:20 UTC (rev 1383) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-08-06 15:05:10 UTC (rev 1384) @@ -559,7 +559,7 @@ case WM_PAINT: /* Turn on the visibility in case it was turned off somehow */ window->State.Visible = GL_TRUE; - InvalidateRect( hWnd, NULL, GL_FALSE ); /* Make sure whole window is repainted. Bt of a hack, but a safe on from what google turns up... */ + InvalidateRect( hWnd, NULL, GL_FALSE ); /* Make sure whole window is repainted. Bit of a hack, but a safe on from what google turns up... */ BeginPaint( hWnd, &ps ); fghRedrawWindow( window ); EndPaint( hWnd, &ps ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-11-16 15:07:42
|
Revision: 1395 http://freeglut.svn.sourceforge.net/freeglut/?rev=1395&view=rev Author: dcnieho Date: 2012-11-16 15:07:33 +0000 (Fri, 16 Nov 2012) Log Message: ----------- added note about maximizing behavior on Windows (when the maximize window tool is pressed by the user) -- resize borders are by default of the screen to maximize the client area. Lets not change this as FreeGLUT has stuck with this default for a long time. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-16 11:02:06 UTC (rev 1394) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-16 15:07:33 UTC (rev 1395) @@ -75,6 +75,16 @@ * 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 */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-11-21 04:18:39
|
Revision: 1460 http://freeglut.svn.sourceforge.net/freeglut/?rev=1460&view=rev Author: dcnieho Date: 2012-11-21 04:18:32 +0000 (Wed, 21 Nov 2012) Log Message: ----------- wrote macro for the special key checks (shift, alt, ctrl) to significantly reduce code length (and it was copy-paste code anyway) Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-20 08:57:18 UTC (rev 1459) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-21 04:18:32 UTC (rev 1460) @@ -277,115 +277,41 @@ fgState.Modifiers = fgPlatformGetModifiers( ); /* Checking for CTRL, ALT, and SHIFT key positions: Key Down! */ - if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_CTRL_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lControl = 1; +#define SPECIAL_KEY_DOWN(winKey,glutKey,winProcVar)\ + if ( !winProcVar && GetAsyncKeyState ( winKey ) )\ + {\ + INVOKE_WCB ( *temp_window, Special,\ + ( glutKey, temp_window->State.MouseX, temp_window->State.MouseY )\ + );\ + winProcVar = 1;\ } - if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_CTRL_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); + SPECIAL_KEY_DOWN(VK_LCONTROL,GLUT_KEY_CTRL_L ,lControl); + SPECIAL_KEY_DOWN(VK_RCONTROL,GLUT_KEY_CTRL_R ,rControl); + SPECIAL_KEY_DOWN(VK_LSHIFT ,GLUT_KEY_SHIFT_L,lShift); + SPECIAL_KEY_DOWN(VK_RSHIFT ,GLUT_KEY_SHIFT_R,rShift); + SPECIAL_KEY_DOWN(VK_LMENU ,GLUT_KEY_ALT_L ,lAlt); + SPECIAL_KEY_DOWN(VK_RMENU ,GLUT_KEY_ALT_R ,rAlt); +#undef SPECIAL_KEY_DOWN - rControl = 1; - } - - if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_SHIFT_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lShift = 1; - } - - if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_SHIFT_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - rShift = 1; - } - - if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_ALT_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lAlt = 1; - } - - if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) ) - { - INVOKE_WCB ( *temp_window, Special, - ( GLUT_KEY_ALT_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - rAlt = 1; - } - /* Checking for CTRL, ALT, and SHIFT key positions: Key Up! */ - if ( lControl && !GetAsyncKeyState ( VK_LCONTROL ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_CTRL_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lControl = 0; +#define SPECIAL_KEY_UP(winKey,glutKey,winProcVar)\ + if ( winProcVar && !GetAsyncKeyState ( winKey ) )\ + {\ + INVOKE_WCB ( *temp_window, SpecialUp,\ + ( glutKey, temp_window->State.MouseX, temp_window->State.MouseY )\ + );\ + winProcVar = 0;\ } - if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_CTRL_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); + SPECIAL_KEY_UP(VK_LCONTROL,GLUT_KEY_CTRL_L ,lControl); + SPECIAL_KEY_UP(VK_RCONTROL,GLUT_KEY_CTRL_R ,rControl); + SPECIAL_KEY_UP(VK_LSHIFT ,GLUT_KEY_SHIFT_L,lShift); + SPECIAL_KEY_UP(VK_RSHIFT ,GLUT_KEY_SHIFT_R,rShift); + SPECIAL_KEY_UP(VK_LMENU ,GLUT_KEY_ALT_L ,lAlt); + SPECIAL_KEY_UP(VK_RMENU ,GLUT_KEY_ALT_R ,rAlt); +#undef SPECIAL_KEY_UP - rControl = 0; - } - - if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_SHIFT_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lShift = 0; - } - - if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_SHIFT_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - rShift = 0; - } - - if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_ALT_L, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - lAlt = 0; - } - - if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) ) - { - INVOKE_WCB ( *temp_window, SpecialUp, - ( GLUT_KEY_ALT_R, temp_window->State.MouseX, temp_window->State.MouseY ) - ); - - rAlt = 0; - } - fgState.Modifiers = INVALID_MODIFIERS; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-11-21 05:15:38
|
Revision: 1463 http://freeglut.svn.sourceforge.net/freeglut/?rev=1463&view=rev Author: dcnieho Date: 2012-11-21 05:15:31 +0000 (Wed, 21 Nov 2012) Log Message: ----------- now using WHEEL_DELTA for mouse wheel processing, instead of a magic number Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-21 04:38:30 UTC (rev 1462) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-21 05:15:31 UTC (rev 1463) @@ -661,10 +661,7 @@ short ticks = ( short )HIWORD( wParam ); fgState.MouseWheelTicks += ticks; - /* - * XXX Should use WHEEL_DELTA instead of 120 - */ - if ( abs ( fgState.MouseWheelTicks ) >= 120 ) + if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) { int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; @@ -675,10 +672,7 @@ fgSetWindow( window ); fgState.Modifiers = fgPlatformGetModifiers( ); - /* - * XXX Should use WHEEL_DELTA instead of 120 - */ - while( abs ( fgState.MouseWheelTicks ) >= 120 ) + while( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) { if( FETCH_WCB( *window, MouseWheel ) ) INVOKE_WCB( *window, MouseWheel, @@ -710,10 +704,7 @@ ); } - /* - * XXX Should use WHEEL_DELTA instead of 120 - */ - fgState.MouseWheelTicks -= 120 * direction; + fgState.MouseWheelTicks -= WHEEL_DELTA * direction; } fgState.Modifiers = INVALID_MODIFIERS; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-11-23 09:31:08
|
Revision: 1483 http://freeglut.svn.sourceforge.net/freeglut/?rev=1483&view=rev Author: dcnieho Date: 2012-11-23 09:30:57 +0000 (Fri, 23 Nov 2012) Log Message: ----------- prevent resize callback (and indeed the whole resizing logic) from getting called twice Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-23 08:40:13 UTC (rev 1482) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-11-23 09:30:57 UTC (rev 1483) @@ -119,6 +119,10 @@ 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; } @@ -415,7 +419,8 @@ */ if( window->State.Visible ) { - window->State.NeedToResize = GL_TRUE; + /* get old values first to compare to below */ + int width = window->State.Width, height=window->State.Height; #if defined(_WIN32_WCE) window->State.Width = HIWORD(lParam); window->State.Height = LOWORD(lParam); @@ -423,6 +428,10 @@ window->State.Width = LOWORD(lParam); window->State.Height = HIWORD(lParam); #endif /* defined(_WIN32_WCE) */ + + if (width!=window->State.Width || height!=window->State.Height) + /* Something changed, need to resize */ + window->State.NeedToResize = GL_TRUE; } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2012-12-18 05:19:27
|
Revision: 1490 http://freeglut.svn.sourceforge.net/freeglut/?rev=1490&view=rev Author: dcnieho Date: 2012-12-18 05:19:21 +0000 (Tue, 18 Dec 2012) Log Message: ----------- avoid crash on null temp_window, thanks Phillip Kutin! Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-12-18 05:13:42 UTC (rev 1489) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2012-12-18 05:19:21 UTC (rev 1490) @@ -269,7 +269,7 @@ if (hwnd) /* can be NULL if mouse outside parent by the time we get here */ { temp_window = fgWindowByHandle(hwnd); - if (temp_window->Parent) /* Verify we got a child window */ + if (temp_window && temp_window->Parent) /* Verify we got a child window */ child_window = temp_window; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-26 15:05:50
|
Revision: 1505 http://freeglut.svn.sourceforge.net/freeglut/?rev=1505&view=rev Author: dcnieho Date: 2013-02-26 15:05:41 +0000 (Tue, 26 Feb 2013) Log Message: ----------- win32: updating keyboard down/up handling. Split off to own function that deals with both down and up to reduce code duplication. Also only get async keystate to see if left or right alt, control, shift is pressed/released when a press on one of these is detected in the first place, not with every message that comes in. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-13 10:28:26 UTC (rev 1504) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:05:41 UTC (rev 1505) @@ -170,15 +170,158 @@ ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); } +static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LPARAM lParam) +{ + static unsigned char lControl = 0, lShift = 0, lAlt = 0, + rControl = 0, rShift = 0, rAlt = 0; + + int keypress = -1; + POINT mouse_pos ; + + /* if keydown, check for repeat */ + if( keydown && ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) + return; + + /* Remember the current modifiers state so user can query it from their callback */ + fgState.Modifiers = fgPlatformGetModifiers( ); + + /* Get mouse position roughly at time of keypress */ + GetCursorPos( &mouse_pos ); + ScreenToClient( window->Window.Handle, &mouse_pos ); + window->State.MouseX = mouse_pos.x; + window->State.MouseY = mouse_pos.y; + + /* Convert the Win32 keystroke codes to GLUTtish way */ +# define KEY(a,b) case a: keypress = b; break; + + switch( wParam ) + { + KEY( VK_F1, GLUT_KEY_F1 ); + KEY( VK_F2, GLUT_KEY_F2 ); + KEY( VK_F3, GLUT_KEY_F3 ); + KEY( VK_F4, GLUT_KEY_F4 ); + KEY( VK_F5, GLUT_KEY_F5 ); + KEY( VK_F6, GLUT_KEY_F6 ); + KEY( VK_F7, GLUT_KEY_F7 ); + KEY( VK_F8, GLUT_KEY_F8 ); + KEY( VK_F9, GLUT_KEY_F9 ); + KEY( VK_F10, GLUT_KEY_F10 ); + KEY( VK_F11, GLUT_KEY_F11 ); + KEY( VK_F12, GLUT_KEY_F12 ); + KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); + KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); + KEY( VK_HOME, GLUT_KEY_HOME ); + KEY( VK_END, GLUT_KEY_END ); + KEY( VK_LEFT, GLUT_KEY_LEFT ); + KEY( VK_UP, GLUT_KEY_UP ); + KEY( VK_RIGHT, GLUT_KEY_RIGHT ); + KEY( VK_DOWN, GLUT_KEY_DOWN ); + KEY( VK_INSERT, GLUT_KEY_INSERT ); + + /* handle control, alt and shift. For GLUT, we want to distinguish between left and right presses. + * The VK_L* & VK_R* left and right Alt, Ctrl and Shift virtual keys are however only used as parameters to GetAsyncKeyState() and GetKeyState() + * so when we get an alt, shift or control keypress here, we manually check whether it was the left or the right + */ +#define ASYNC_KEY_EVENT(winKey,glutKey,keyStateVar)\ + if (!keyStateVar && GetAsyncKeyState ( winKey ))\ + {\ + keypress = glutKey;\ + keyStateVar = 1;\ + }\ + else if (keyStateVar && !GetAsyncKeyState ( winKey ))\ + {\ + keypress = glutKey;\ + keyStateVar = 0;\ + } + case VK_CONTROL: + ASYNC_KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl); + ASYNC_KEY_EVENT(VK_RCONTROL,GLUT_KEY_CTRL_R,rControl); + break; + case VK_SHIFT: + ASYNC_KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift); + ASYNC_KEY_EVENT(VK_RSHIFT,GLUT_KEY_SHIFT_R,rShift); + break; + case VK_MENU: + ASYNC_KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt); + ASYNC_KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt); + break; +#undef ASYNC_KEY_EVENT + + case VK_DELETE: + /* The delete key should be treated as an ASCII keypress: */ + if (keydown) + INVOKE_WCB( *window, Keyboard, + ( 127, window->State.MouseX, window->State.MouseY ) + ); + else + INVOKE_WCB( *window, KeyboardUp, + ( 127, window->State.MouseX, window->State.MouseY ) + ); + break; + +#if !defined(_WIN32_WCE) + default: + /* keydown displayable characters are handled with WM_CHAR message, but no corresponding up is generated. So get that here. */ + if (!keydown) + { + BYTE state[ 256 ]; + WORD code[ 2 ]; + + GetKeyboardState( state ); + + if( ToAscii( (UINT)wParam, 0, state, code, 0 ) == 1 ) + wParam=code[ 0 ]; + + INVOKE_WCB( *window, KeyboardUp, + ( (char)wParam, + window->State.MouseX, window->State.MouseY ) + ); + } +#endif + } + +#if defined(_WIN32_WCE) + if(keydown && !(lParam & 0x40000000)) /* Prevent auto-repeat */ + { + if(wParam==(unsigned)gxKeyList.vkRight) + keypress = GLUT_KEY_RIGHT; + else if(wParam==(unsigned)gxKeyList.vkLeft) + keypress = GLUT_KEY_LEFT; + else if(wParam==(unsigned)gxKeyList.vkUp) + keypress = GLUT_KEY_UP; + else if(wParam==(unsigned)gxKeyList.vkDown) + keypress = GLUT_KEY_DOWN; + else if(wParam==(unsigned)gxKeyList.vkA) + keypress = GLUT_KEY_F1; + else if(wParam==(unsigned)gxKeyList.vkB) + keypress = GLUT_KEY_F2; + else if(wParam==(unsigned)gxKeyList.vkC) + keypress = GLUT_KEY_F3; + else if(wParam==(unsigned)gxKeyList.vkStart) + keypress = GLUT_KEY_F4; + } +#endif + + if( keypress != -1 ) + if (keydown) + INVOKE_WCB( *window, Special, + ( keypress, + window->State.MouseX, window->State.MouseY ) + ); + else + INVOKE_WCB( *window, SpecialUp, + ( keypress, + window->State.MouseX, window->State.MouseY ) + ); + + fgState.Modifiers = INVALID_MODIFIERS; +} + /* * The window procedure for handling Win32 events */ -LRESULT CALLBACK fgPlatformWindowProc( 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; - SFG_Window *window, *child_window = NULL; PAINTSTRUCT ps; LRESULT lRet = 1; @@ -214,52 +357,7 @@ child_window = temp_window; } } - - if ( window ) - { - SFG_Window* temp_window = child_window?child_window:window; - - fgState.Modifiers = fgPlatformGetModifiers( ); - - /* Checking for CTRL, ALT, and SHIFT key positions: Key Down! */ -#define SPECIAL_KEY_DOWN(winKey,glutKey,winProcVar)\ - if ( !winProcVar && GetAsyncKeyState ( winKey ) )\ - {\ - INVOKE_WCB ( *temp_window, Special,\ - ( glutKey, temp_window->State.MouseX, temp_window->State.MouseY )\ - );\ - winProcVar = 1;\ - } - - SPECIAL_KEY_DOWN(VK_LCONTROL,GLUT_KEY_CTRL_L ,lControl); - SPECIAL_KEY_DOWN(VK_RCONTROL,GLUT_KEY_CTRL_R ,rControl); - SPECIAL_KEY_DOWN(VK_LSHIFT ,GLUT_KEY_SHIFT_L,lShift); - SPECIAL_KEY_DOWN(VK_RSHIFT ,GLUT_KEY_SHIFT_R,rShift); - SPECIAL_KEY_DOWN(VK_LMENU ,GLUT_KEY_ALT_L ,lAlt); - SPECIAL_KEY_DOWN(VK_RMENU ,GLUT_KEY_ALT_R ,rAlt); -#undef SPECIAL_KEY_DOWN - - /* Checking for CTRL, ALT, and SHIFT key positions: Key Up! */ -#define SPECIAL_KEY_UP(winKey,glutKey,winProcVar)\ - if ( winProcVar && !GetAsyncKeyState ( winKey ) )\ - {\ - INVOKE_WCB ( *temp_window, SpecialUp,\ - ( glutKey, temp_window->State.MouseX, temp_window->State.MouseY )\ - );\ - winProcVar = 0;\ - } - - SPECIAL_KEY_UP(VK_LCONTROL,GLUT_KEY_CTRL_L ,lControl); - SPECIAL_KEY_UP(VK_RCONTROL,GLUT_KEY_CTRL_R ,rControl); - SPECIAL_KEY_UP(VK_LSHIFT ,GLUT_KEY_SHIFT_L,lShift); - SPECIAL_KEY_UP(VK_RSHIFT ,GLUT_KEY_SHIFT_R,rShift); - SPECIAL_KEY_UP(VK_LMENU ,GLUT_KEY_ALT_L ,lAlt); - SPECIAL_KEY_UP(VK_RMENU ,GLUT_KEY_ALT_R ,rAlt); -#undef SPECIAL_KEY_UP - - fgState.Modifiers = INVALID_MODIFIERS; - } - + switch( uMsg ) { case WM_CREATE: @@ -687,190 +785,16 @@ case WM_SYSKEYDOWN: case WM_KEYDOWN: - { - int keypress = -1; - POINT mouse_pos ; - if (child_window) window = child_window; - - if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) - break; - - /* - * Remember the current modifiers state. This is done here in order - * to make sure the VK_DELETE keyboard callback is executed properly. - */ - fgState.Modifiers = fgPlatformGetModifiers( ); - - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - - /* Convert the Win32 keystroke codes to GLUTtish way */ -# define KEY(a,b) case a: keypress = b; break; - - switch( wParam ) - { - KEY( VK_F1, GLUT_KEY_F1 ); - KEY( VK_F2, GLUT_KEY_F2 ); - KEY( VK_F3, GLUT_KEY_F3 ); - KEY( VK_F4, GLUT_KEY_F4 ); - KEY( VK_F5, GLUT_KEY_F5 ); - KEY( VK_F6, GLUT_KEY_F6 ); - KEY( VK_F7, GLUT_KEY_F7 ); - KEY( VK_F8, GLUT_KEY_F8 ); - KEY( VK_F9, GLUT_KEY_F9 ); - KEY( VK_F10, GLUT_KEY_F10 ); - KEY( VK_F11, GLUT_KEY_F11 ); - KEY( VK_F12, GLUT_KEY_F12 ); - KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); - KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); - KEY( VK_HOME, GLUT_KEY_HOME ); - KEY( VK_END, GLUT_KEY_END ); - KEY( VK_LEFT, GLUT_KEY_LEFT ); - KEY( VK_UP, GLUT_KEY_UP ); - KEY( VK_RIGHT, GLUT_KEY_RIGHT ); - KEY( VK_DOWN, GLUT_KEY_DOWN ); - KEY( VK_INSERT, GLUT_KEY_INSERT ); - - case VK_LCONTROL: case VK_RCONTROL: case VK_CONTROL: - case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: - case VK_LMENU: case VK_RMENU: case VK_MENU: - /* These keypresses and releases are handled earlier in the function */ - break; - - case VK_DELETE: - /* The delete key should be treated as an ASCII keypress: */ - INVOKE_WCB( *window, Keyboard, - ( 127, window->State.MouseX, window->State.MouseY ) - ); - } - -#if defined(_WIN32_WCE) - if(!(lParam & 0x40000000)) /* Prevent auto-repeat */ - { - if(wParam==(unsigned)gxKeyList.vkRight) - keypress = GLUT_KEY_RIGHT; - else if(wParam==(unsigned)gxKeyList.vkLeft) - keypress = GLUT_KEY_LEFT; - else if(wParam==(unsigned)gxKeyList.vkUp) - keypress = GLUT_KEY_UP; - else if(wParam==(unsigned)gxKeyList.vkDown) - keypress = GLUT_KEY_DOWN; - else if(wParam==(unsigned)gxKeyList.vkA) - keypress = GLUT_KEY_F1; - else if(wParam==(unsigned)gxKeyList.vkB) - keypress = GLUT_KEY_F2; - else if(wParam==(unsigned)gxKeyList.vkC) - keypress = GLUT_KEY_F3; - else if(wParam==(unsigned)gxKeyList.vkStart) - keypress = GLUT_KEY_F4; - } -#endif - - if( keypress != -1 ) - INVOKE_WCB( *window, Special, - ( keypress, - window->State.MouseX, window->State.MouseY ) - ); - - fgState.Modifiers = INVALID_MODIFIERS; - } + fghKeyPress(window,GL_TRUE,wParam,lParam); break; case WM_SYSKEYUP: case WM_KEYUP: - { - int keypress = -1; - POINT mouse_pos; - if (child_window) window = child_window; - - /* - * Remember the current modifiers state. This is done here in order - * to make sure the VK_DELETE keyboard callback is executed properly. - */ - fgState.Modifiers = fgPlatformGetModifiers( ); - - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - - /* - * Convert the Win32 keystroke codes to GLUTtish way. - * "KEY(a,b)" was defined under "WM_KEYDOWN" - */ - - switch( wParam ) - { - KEY( VK_F1, GLUT_KEY_F1 ); - KEY( VK_F2, GLUT_KEY_F2 ); - KEY( VK_F3, GLUT_KEY_F3 ); - KEY( VK_F4, GLUT_KEY_F4 ); - KEY( VK_F5, GLUT_KEY_F5 ); - KEY( VK_F6, GLUT_KEY_F6 ); - KEY( VK_F7, GLUT_KEY_F7 ); - KEY( VK_F8, GLUT_KEY_F8 ); - KEY( VK_F9, GLUT_KEY_F9 ); - KEY( VK_F10, GLUT_KEY_F10 ); - KEY( VK_F11, GLUT_KEY_F11 ); - KEY( VK_F12, GLUT_KEY_F12 ); - KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); - KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); - KEY( VK_HOME, GLUT_KEY_HOME ); - KEY( VK_END, GLUT_KEY_END ); - KEY( VK_LEFT, GLUT_KEY_LEFT ); - KEY( VK_UP, GLUT_KEY_UP ); - KEY( VK_RIGHT, GLUT_KEY_RIGHT ); - KEY( VK_DOWN, GLUT_KEY_DOWN ); - KEY( VK_INSERT, GLUT_KEY_INSERT ); - - case VK_LCONTROL: case VK_RCONTROL: case VK_CONTROL: - case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: - case VK_LMENU: case VK_RMENU: case VK_MENU: - /* These keypresses and releases are handled earlier in the function */ - break; - - case VK_DELETE: - /* The delete key should be treated as an ASCII keypress: */ - INVOKE_WCB( *window, KeyboardUp, - ( 127, window->State.MouseX, window->State.MouseY ) - ); - break; - - default: - { -#if !defined(_WIN32_WCE) - BYTE state[ 256 ]; - WORD code[ 2 ]; - - GetKeyboardState( state ); - - if( ToAscii( (UINT)wParam, 0, state, code, 0 ) == 1 ) - wParam=code[ 0 ]; - - INVOKE_WCB( *window, KeyboardUp, - ( (char)wParam, - window->State.MouseX, window->State.MouseY ) - ); -#endif /* !defined(_WIN32_WCE) */ - } - } - - if( keypress != -1 ) - INVOKE_WCB( *window, SpecialUp, - ( keypress, - window->State.MouseX, window->State.MouseY ) - ); - - fgState.Modifiers = INVALID_MODIFIERS; - } + fghKeyPress(window,GL_FALSE,wParam,lParam); break; case WM_SYSCHAR: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-26 15:20:24
|
Revision: 1506 http://freeglut.svn.sourceforge.net/freeglut/?rev=1506&view=rev Author: dcnieho Date: 2013-02-26 15:20:18 +0000 (Tue, 26 Feb 2013) Log Message: ----------- win API docs say that defWndProc must be called for system keydown/keyup Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:05:41 UTC (rev 1505) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:20:18 UTC (rev 1506) @@ -170,7 +170,7 @@ ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); } -static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LPARAM lParam) +static LRESULT fghKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) { static unsigned char lControl = 0, lShift = 0, lAlt = 0, rControl = 0, rShift = 0, rAlt = 0; @@ -180,7 +180,7 @@ /* if keydown, check for repeat */ if( keydown && ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) - return; + return 1; /* Remember the current modifiers state so user can query it from their callback */ fgState.Modifiers = fgPlatformGetModifiers( ); @@ -315,6 +315,12 @@ ); fgState.Modifiers = INVALID_MODIFIERS; + + /* SYSKEY events should be sent to default window proc for system to handle them */ + if (uMsg==WM_SYSKEYDOWN || uMsg==WM_SYSKEYUP) + return DefWindowProc( window->Window.Handle, uMsg, wParam, lParam ); + else + return 1; } /* @@ -787,14 +793,14 @@ case WM_KEYDOWN: if (child_window) window = child_window; - fghKeyPress(window,GL_TRUE,wParam,lParam); + lRet = fghKeyPress(window,uMsg,GL_TRUE,wParam,lParam); break; case WM_SYSKEYUP: case WM_KEYUP: if (child_window) window = child_window; - fghKeyPress(window,GL_FALSE,wParam,lParam); + lRet = fghKeyPress(window,uMsg,GL_FALSE,wParam,lParam); break; case WM_SYSCHAR: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-26 15:21:40
|
Revision: 1507 http://freeglut.svn.sourceforge.net/freeglut/?rev=1507&view=rev Author: dcnieho Date: 2013-02-26 15:21:34 +0000 (Tue, 26 Feb 2013) Log Message: ----------- better name for key up/down function Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:20:18 UTC (rev 1506) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:21:34 UTC (rev 1507) @@ -170,7 +170,7 @@ ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); } -static LRESULT fghKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) +static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) { static unsigned char lControl = 0, lShift = 0, lAlt = 0, rControl = 0, rShift = 0, rAlt = 0; @@ -793,14 +793,14 @@ case WM_KEYDOWN: if (child_window) window = child_window; - lRet = fghKeyPress(window,uMsg,GL_TRUE,wParam,lParam); + lRet = fghWindowProcKeyPress(window,uMsg,GL_TRUE,wParam,lParam); break; case WM_SYSKEYUP: case WM_KEYUP: if (child_window) window = child_window; - lRet = fghKeyPress(window,uMsg,GL_FALSE,wParam,lParam); + lRet = fghWindowProcKeyPress(window,uMsg,GL_FALSE,wParam,lParam); break; case WM_SYSCHAR: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-26 16:13:15
|
Revision: 1508 http://freeglut.svn.sourceforge.net/freeglut/?rev=1508&view=rev Author: dcnieho Date: 2013-02-26 16:13:09 +0000 (Tue, 26 Feb 2013) Log Message: ----------- some msgs only sent to parent window, find child under cursor. This before only search for childs of the parent, not grandchilds or more derived. Fixed Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 15:21:34 UTC (rev 1507) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-26 16:13:09 UTC (rev 1508) @@ -323,6 +323,33 @@ return 1; } +void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window) +{ + /* Check if the current window that the mouse is over is a child window + * of the window the message was sent to. + */ + if (window && window->Children.First) + { + POINT mouse_pos; + SFG_WindowHandleType hwnd; + SFG_Window* temp_window; + + GetCursorPos( &mouse_pos ); + ScreenToClient( window->Window.Handle, &mouse_pos ); + hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); + if (hwnd && hwnd!=window->Window.Handle) /* can be NULL if mouse outside parent by the time we get here, or can be same as parent if we didn't find a child */ + { + temp_window = fgWindowByHandle(hwnd); + if (temp_window) /* Verify we got a FreeGLUT window */ + { + *child_window = temp_window; + /* ChildWindowFromPoint only searches immediate children, so search again to see if actually in grandchild or further descendant */ + fghWindowUnderCursor(temp_window,child_window); + } + } + } +} + /* * The window procedure for handling Win32 events */ @@ -347,22 +374,7 @@ * we make sure that we process callbacks on the child window instead. * This mirrors how GLUT does things. */ - if (window && window->Children.First) - { - POINT mouse_pos; - SFG_WindowHandleType hwnd; - SFG_Window* temp_window; - - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); - if (hwnd) /* can be NULL if mouse outside parent by the time we get here */ - { - temp_window = fgWindowByHandle(hwnd); - if (temp_window && temp_window->Parent) /* Verify we got a child window */ - child_window = temp_window; - } - } + fghWindowUnderCursor(window, &child_window); switch( uMsg ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-27 05:59:04
|
Revision: 1515 http://freeglut.svn.sourceforge.net/freeglut/?rev=1515&view=rev Author: dcnieho Date: 2013-02-27 05:58:56 +0000 (Wed, 27 Feb 2013) Log Message: ----------- Use GetMessagePos, not GetCursorPos to make sure we get the right mouse position. Also, no need to get mouse position at time of keypress, every mouse movement before the keypress is processed in an earlier WM_MOUSE message already, so mouse position in the window state is all we need. Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 04:58:23 UTC (rev 1514) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 05:58:56 UTC (rev 1515) @@ -176,7 +176,6 @@ rControl = 0, rShift = 0, rAlt = 0; int keypress = -1; - POINT mouse_pos ; /* if keydown, check for repeat */ /* If repeat is globally switched off, it cannot be switched back on per window. @@ -190,12 +189,6 @@ /* Remember the current modifiers state so user can query it from their callback */ fgState.Modifiers = fgPlatformGetModifiers( ); - /* Get mouse position roughly at time of keypress */ - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - /* Convert the Win32 keystroke codes to GLUTtish way */ # define KEY(a,b) case a: keypress = b; break; @@ -339,8 +332,12 @@ SFG_WindowHandleType hwnd; SFG_Window* temp_window; - GetCursorPos( &mouse_pos ); + /* Get mouse position at time of message */ + DWORD mouse_pos_Dword = GetMessagePos(); + mouse_pos.x = GET_X_LPARAM(mouse_pos_Dword); + mouse_pos.y = GET_Y_LPARAM(mouse_pos_Dword); ScreenToClient( window->Window.Handle, &mouse_pos ); + hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); if (hwnd && hwnd!=window->Window.Handle) /* can be NULL if mouse outside parent by the time we get here, or can be same as parent if we didn't find a child */ { @@ -559,6 +556,7 @@ #if 0 case WM_ACTIVATE: + //printf("WM_ACTIVATE: %x %d %d\n",lParam, HIWORD(wParam), LOWORD(wParam)); if (LOWORD(wParam) != WA_INACTIVE) { /* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-27 06:11:58
|
Revision: 1516 http://freeglut.svn.sourceforge.net/freeglut/?rev=1516&view=rev Author: dcnieho Date: 2013-02-27 06:11:51 +0000 (Wed, 27 Feb 2013) Log Message: ----------- WM_SETFOCUS should not change focus to child instead, then all input goes to child even if it should go to parent. Mousewheel needed to check if actually in child, other mouse action (move, press) are automatically passed to child Modified Paths: -------------- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c Modified: trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c =================================================================== --- trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 05:58:56 UTC (rev 1515) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 06:11:51 UTC (rev 1516) @@ -523,20 +523,8 @@ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - if (child_window) - { - /* If we're dealing with a child window, make sure it has input focus instead, set it here. */ - SetFocus(child_window->Window.Handle); - SetActiveWindow( child_window->Window.Handle ); - INVOKE_WCB( *child_window, Entry, ( GLUT_ENTERED ) ); - UpdateWindow ( child_window->Window.Handle ); - } - else - { - SetActiveWindow( window->Window.Handle ); - INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); - } - /* Always request update on main window to be safe */ + SetActiveWindow( window->Window.Handle ); + INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); UpdateWindow ( hWnd ); break; @@ -751,8 +739,11 @@ { int wheel_number = LOWORD( wParam ); short ticks = ( short )HIWORD( wParam ); - fgState.MouseWheelTicks += ticks; + if (child_window) + window = child_window; + + fgState.MouseWheelTicks += ticks; if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) { int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; @@ -806,16 +797,12 @@ case WM_SYSKEYDOWN: case WM_KEYDOWN: - if (child_window) - window = child_window; - lRet = fghWindowProcKeyPress(window,uMsg,GL_TRUE,wParam,lParam); + lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_TRUE,wParam,lParam); break; case WM_SYSKEYUP: case WM_KEYUP: - if (child_window) - window = child_window; - lRet = fghWindowProcKeyPress(window,uMsg,GL_FALSE,wParam,lParam); + lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_FALSE,wParam,lParam); break; case WM_SYSCHAR: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |