From: <dc...@us...> - 2013-02-27 06:18:27
|
Revision: 1517 http://freeglut.svn.sourceforge.net/freeglut/?rev=1517&view=rev Author: dcnieho Date: 2013-02-27 06:18:20 +0000 (Wed, 27 Feb 2013) Log Message: ----------- Only check for child window when needed, some cleanup 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 06:11:51 UTC (rev 1516) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 06:18:20 UTC (rev 1517) @@ -324,7 +324,9 @@ 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. + * of the window the message was sent to. Some events only sent to main window, + * and when handling some messages, we need to make sure that we process + * callbacks on the child window instead. This mirrors how GLUT does things. */ if (window && window->Children.First) { @@ -357,8 +359,7 @@ */ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { - SFG_Window *window, *child_window = NULL; - PAINTSTRUCT ps; + SFG_Window *window; LRESULT lRet = 1; FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ; @@ -371,13 +372,6 @@ /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, uMsg, wParam, lParam ); */ - /* Some events only sent to main window. Check if the current window that - * the mouse is over is a child window. Below when handling some messages, - * we make sure that we process callbacks on the child window instead. - * This mirrors how GLUT does things. - */ - fghWindowUnderCursor(window, &child_window); - switch( uMsg ) { case WM_CREATE: @@ -570,13 +564,16 @@ break; case WM_PAINT: + { + PAINTSTRUCT ps; /* 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. Bit of a hack, but a safe one from what google turns up... */ BeginPaint( hWnd, &ps ); fghRedrawWindow( window ); EndPaint( hWnd, &ps ); - break; + } + break; case WM_CLOSE: fgDestroyWindow ( window ); @@ -737,9 +734,11 @@ case WM_MOUSEWHEEL: { + SFG_Window *child_window = NULL; int wheel_number = LOWORD( wParam ); short ticks = ( short )HIWORD( wParam ); + fghWindowUnderCursor(window, &child_window); if (child_window) window = child_window; @@ -797,17 +796,27 @@ case WM_SYSKEYDOWN: case WM_KEYDOWN: + { + SFG_Window *child_window = NULL; + fghWindowUnderCursor(window, &child_window); lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_TRUE,wParam,lParam); + } break; case WM_SYSKEYUP: case WM_KEYUP: + { + SFG_Window *child_window = NULL; + fghWindowUnderCursor(window, &child_window); lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_FALSE,wParam,lParam); + } break; case WM_SYSCHAR: case WM_CHAR: { + SFG_Window *child_window = NULL; + fghWindowUnderCursor(window, &child_window); if (child_window) window = child_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 07:01:51
|
Revision: 1518 http://freeglut.svn.sourceforge.net/freeglut/?rev=1518&view=rev Author: dcnieho Date: 2013-02-27 07:01:43 +0000 (Wed, 27 Feb 2013) Log Message: ----------- Simplified fghWindowUnderCursor, cleane dup 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 2013-02-27 06:18:20 UTC (rev 1517) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 07:01:43 UTC (rev 1518) @@ -321,37 +321,37 @@ return 1; } -void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window) +static SFG_Window* fghWindowUnderCursor(SFG_Window *window) { /* Check if the current window that the mouse is over is a child window * of the window the message was sent to. Some events only sent to main window, * and when handling some messages, we need to make sure that we process * callbacks on the child window instead. This mirrors how GLUT does things. + * returns either the original window or the found child. */ - if (window && window->Children.First) + if (window && window->Children.First) /* This window has childs */ { - POINT mouse_pos; SFG_WindowHandleType hwnd; - SFG_Window* temp_window; + SFG_Window* child_window; /* 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); + DWORD mouse_pos_dw = GetMessagePos(); + POINT mouse_pos = {GET_X_LPARAM(mouse_pos_dw), GET_Y_LPARAM(mouse_pos_dw)}; 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 = fgWindowByHandle(hwnd); + if (child_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); + window = fghWindowUnderCursor(child_window); } } } + + return window; } /* @@ -738,9 +738,7 @@ int wheel_number = LOWORD( wParam ); short ticks = ( short )HIWORD( wParam ); - fghWindowUnderCursor(window, &child_window); - if (child_window) - window = child_window; + window = fghWindowUnderCursor(window); fgState.MouseWheelTicks += ticks; if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) @@ -797,28 +795,23 @@ case WM_SYSKEYDOWN: case WM_KEYDOWN: { - SFG_Window *child_window = NULL; - fghWindowUnderCursor(window, &child_window); - lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_TRUE,wParam,lParam); + window = fghWindowUnderCursor(window); + lRet = fghWindowProcKeyPress(window,uMsg,GL_TRUE,wParam,lParam); } break; case WM_SYSKEYUP: case WM_KEYUP: { - SFG_Window *child_window = NULL; - fghWindowUnderCursor(window, &child_window); - lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_FALSE,wParam,lParam); + window = fghWindowUnderCursor(window); + lRet = fghWindowProcKeyPress(window,uMsg,GL_FALSE,wParam,lParam); } break; case WM_SYSCHAR: case WM_CHAR: { - SFG_Window *child_window = NULL; - fghWindowUnderCursor(window, &child_window); - if (child_window) - window = child_window; + window = fghWindowUnderCursor(window); 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...> - 2013-02-27 08:06:30
|
Revision: 1521 http://freeglut.svn.sourceforge.net/freeglut/?rev=1521&view=rev Author: dcnieho Date: 2013-02-27 08:06:24 +0000 (Wed, 27 Feb 2013) Log Message: ----------- Only do mouse tracking for EntryFunc if user specified an entryfunc 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 07:52:55 UTC (rev 1520) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 08:06:24 UTC (rev 1521) @@ -554,16 +554,24 @@ { TRACKMOUSEEVENT tme; - /* Cursor just entered window, set cursor look, invoke callback and start tracking so that we get a WM_MOUSELEAVE message */ + /* Cursor just entered window, set cursor look */ fgSetCursor ( window, window->State.Cursor ) ; - INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = window->Window.Handle; - TrackMouseEvent(&tme); + /* If an EntryFunc callback is specified by the user, also + * invoke that callback and start mouse tracking so that + * we get a WM_MOUSELEAVE message + */ + if (FETCH_WCB( *window, Entry )) + { + INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); - window->State.pWState.MouseTracking = GL_TRUE; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = window->Window.Handle; + TrackMouseEvent(&tme); + + window->State.pWState.MouseTracking = GL_TRUE; + } } } else @@ -573,6 +581,10 @@ case WM_MOUSELEAVE: { + /* NB: This message is only received when a EntryFunc callback + * is specified by the user, as that is the only condition under + * which mouse tracking is setup in WM_SETCURSOR handler above + */ SFG_Window* saved_window = fgStructure.CurrentWindow; INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); fgSetWindow(saved_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 08:18:15
|
Revision: 1522 http://freeglut.svn.sourceforge.net/freeglut/?rev=1522&view=rev Author: dcnieho Date: 2013-02-27 08:18:09 +0000 (Wed, 27 Feb 2013) Log Message: ----------- should return zero after processing any of the mouse button down or up events 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 08:06:24 UTC (rev 1521) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 08:18:09 UTC (rev 1522) @@ -765,6 +765,9 @@ ); fgState.Modifiers = INVALID_MODIFIERS; + + /* As per docs, should return zero */ + lRet = 0; } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-27 10:46:19
|
Revision: 1525 http://freeglut.svn.sourceforge.net/freeglut/?rev=1525&view=rev Author: dcnieho Date: 2013-02-27 10:46:13 +0000 (Wed, 27 Feb 2013) Log Message: ----------- Mousemotion events now generated outside the window until all mouse buttons released, as is done on X11 (according to comments i now deleted) 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 10:29:24 UTC (rev 1524) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 10:46:13 UTC (rev 1525) @@ -736,17 +736,16 @@ window->State.MouseX, window->State.MouseY ) ) break; - /* Set capture so that the window captures all the mouse messages */ - /* - * XXX - Multiple button support: Under X11, the mouse is not released - * XXX - from the window until all buttons have been released, even if the - * XXX - user presses a button in another window. This will take more - * XXX - code changes than I am up to at the moment (10/5/04). The present - * XXX - is a 90 percent solution. + /* Set capture so that the window captures all the mouse messages + * + * The mouse is not released from the window until all buttons have + * been released, even if the user presses a button in another window. + * This is consistent with the behavior on X11. */ if ( pressed == GL_TRUE ) SetCapture ( window->Window.Handle ) ; - else + else if (!GetAsyncKeyState(VK_LBUTTON) && !GetAsyncKeyState(VK_MBUTTON) && !GetAsyncKeyState(VK_RBUTTON)) + /* Make sure all mouse buttons are released before releasing capture */ ReleaseCapture () ; if( ! FETCH_WCB( *window, Mouse ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-02-27 12:11:40
|
Revision: 1528 http://freeglut.svn.sourceforge.net/freeglut/?rev=1528&view=rev Author: dcnieho Date: 2013-02-27 12:11:33 +0000 (Wed, 27 Feb 2013) Log Message: ----------- No need to handle WM_CANCELMODE, defwindowproc takes care of it (releasing capture), and we have WM_CAPTURECHANGED to make sure our application is in consistent state 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 12:07:26 UTC (rev 1527) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-02-27 12:11:33 UTC (rev 1528) @@ -624,17 +624,6 @@ */ return 0; - case WM_CANCELMODE: - /* - * The window manager sends this message when it detects a change - * that requires that an application cancel any modal state it has - * entered. If we've called SetCapture in the mouse button handler, - * call ReleaseCapture. - */ - if (setCaptureActive) - ReleaseCapture(); - break; - case WM_MOUSEMOVE: { #if defined(_WIN32_WCE) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-03-01 06:50:23
|
Revision: 1537 http://freeglut.svn.sourceforge.net/freeglut/?rev=1537&view=rev Author: dcnieho Date: 2013-03-01 06:50:15 +0000 (Fri, 01 Mar 2013) Log Message: ----------- updated docs for fgPlatformMainLoopPreliminaryWork 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-03-01 05:53:51 UTC (rev 1536) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-03-01 06:50:15 UTC (rev 1537) @@ -138,7 +138,7 @@ INVOKE_WCB( *window, WindowStatus, ( visState ? GLUT_FULLY_RETAINED:GLUT_HIDDEN ) ); } - /* Also notify children */ + /* Also set visibility state for children */ for( child = ( SFG_Window * )window->Children.First; child; child = ( SFG_Window * )child->Node.Next ) @@ -168,12 +168,13 @@ /* * Processing before the main loop: If there is a window which is open and - * which has a visibility callback, call it. I know this is an ugly hack, - * but I'm not sure what else to do about it. Ideally we should leave - * something uninitialized in the create window code and initialize it in - * the main loop, and have that initialization create a "WM_ACTIVATE" - * message. Then we would put the visibility callback code in the - * "case WM_ACTIVATE" block below. - John Fay -- 10/24/02 + * which has a visibility/windowStatus callback, call it to inform the client + * code that the window is visible. I know this is an ugly hack, + * but I'm not sure what else to do about it. Depending on WM_ACTIVATE would + * not work as not all windows get this when you are opening multiple before + * the mainloop starts. WM_SHOWWINDOW looked like an interesting candidate, but + * it is generated and processed before glutCreate(Sub)Window returns, so no + * callback can yet be set on the window. */ while( window ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-03-01 15:42:34
|
Revision: 1542 http://freeglut.svn.sourceforge.net/freeglut/?rev=1542&view=rev Author: dcnieho Date: 2013-03-01 15:42:26 +0000 (Fri, 01 Mar 2013) Log Message: ----------- fixed up handling of WM_MOUSEWHEEL, low order of wParam is not the mouse wheel number, but indicates which virtual keys are pressed during the scroll wheel motion 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-03-01 10:31:34 UTC (rev 1541) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-03-01 15:42:26 UTC (rev 1542) @@ -811,8 +811,9 @@ case WM_MOUSEWHEEL: { SFG_Window *child_window = NULL; - int wheel_number = LOWORD( wParam ); - short ticks = ( short )HIWORD( wParam ); + int wheel_number = 0; /* Only one scroll wheel on windows */ + /* int GET_KEYSTATE_WPARAM( wParam ); */ + short ticks = GET_WHEEL_DELTA_WPARAM( wParam ); window = fghWindowUnderCursor(window); @@ -865,6 +866,8 @@ fgState.Modifiers = INVALID_MODIFIERS; } + /* Per docs, should return zero */ + lRet = 0; } break ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-03-01 18:29:02
|
Revision: 1546 http://freeglut.svn.sourceforge.net/freeglut/?rev=1546&view=rev Author: dcnieho Date: 2013-03-01 18:28:55 +0000 (Fri, 01 Mar 2013) Log Message: ----------- WM_PAINT more conform to docs 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-03-01 17:44:44 UTC (rev 1545) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-03-01 18:28:55 UTC (rev 1546) @@ -648,14 +648,21 @@ case WM_PAINT: { - PAINTSTRUCT ps; - /* Turn on the visibility in case it was turned off somehow */ - window->State.Visible = GL_TRUE; + RECT rect; - InvalidateRect( hWnd, NULL, GL_FALSE ); /* Make sure whole window is repainted. Bit of a hack, but a safe one from what google turns up... */ - BeginPaint( hWnd, &ps ); - fghRedrawWindow( window ); - EndPaint( hWnd, &ps ); + if (GetUpdateRect(hWnd,&rect,FALSE)) + { + /* As per docs, upon receiving WM_PAINT, first check if the update region is not empty before you call BeginPaint */ + PAINTSTRUCT ps; + + /* Turn on the visibility in case it was turned off somehow */ + window->State.Visible = GL_TRUE; + + InvalidateRect( hWnd, NULL, GL_FALSE ); + BeginPaint( hWnd, &ps ); + fghRedrawWindow( window ); + EndPaint( hWnd, &ps ); + } } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-03-01 18:43:30
|
Revision: 1547 http://freeglut.svn.sourceforge.net/freeglut/?rev=1547&view=rev Author: dcnieho Date: 2013-03-01 18:43:22 +0000 (Fri, 01 Mar 2013) Log Message: ----------- missed the windowproc return value 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-03-01 18:28:55 UTC (rev 1546) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-03-01 18:43:22 UTC (rev 1547) @@ -663,6 +663,7 @@ fghRedrawWindow( window ); EndPaint( hWnd, &ps ); } + lRet = 0; /* As per docs, should return 0 */ } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-03-04 09:25:22
|
Revision: 1549 http://freeglut.svn.sourceforge.net/freeglut/?rev=1549&view=rev Author: dcnieho Date: 2013-03-04 09:25:15 +0000 (Mon, 04 Mar 2013) Log Message: ----------- callign entryfunc should not steal the current window, so save before calling and restore after callback returns 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-03-04 09:17:03 UTC (rev 1548) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-03-04 09:25:15 UTC (rev 1549) @@ -601,7 +601,9 @@ */ if (FETCH_WCB( *window, Entry )) { + SFG_Window* saved_window = fgStructure.CurrentWindow; INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); + fgSetWindow(saved_window); tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-04-04 10:20:54
|
Revision: 1584 http://freeglut.svn.sourceforge.net/freeglut/?rev=1584&view=rev Author: dcnieho Date: 2013-04-04 10:20:43 +0000 (Thu, 04 Apr 2013) Log Message: ----------- and with 0xFF to indicate to runtime that we want to strip out higher bits - otherwise we get a runtime error when "Smaller Type Checks" is enabled Thanks Jason Wilkins! 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-04-04 10:13:45 UTC (rev 1583) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-04-04 10:20:43 UTC (rev 1584) @@ -296,7 +296,7 @@ wParam=code[ 0 ]; INVOKE_WCB( *window, KeyboardUp, - ( (char)wParam, + ( (char)(wParam & 0xFF), /* and with 0xFF to indicate to runtime that we want to strip out higher bits - otherwise we get a runtime error when "Smaller Type Checks" is enabled */ window->State.MouseX, window->State.MouseY ) ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-04-05 09:13:57
|
Revision: 1597 http://freeglut.svn.sourceforge.net/freeglut/?rev=1597&view=rev Author: dcnieho Date: 2013-04-05 09:13:48 +0000 (Fri, 05 Apr 2013) Log Message: ----------- implemented WM_DISPLAYCHANGE message handler per patch in very old bug report (1212167). This for us only helps make sure that glutGet(GLUT_SCREEN_WIDTH) and glutGet(GLUT_SCREEN_HEIGHT) return the correct values, and help make sure menu placement is clipped against the correct window extents. Thanks Dan! 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-04-05 09:00:40 UTC (rev 1596) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-04-05 09:13:48 UTC (rev 1597) @@ -981,6 +981,12 @@ /* Help screen says this message must be passed to "DefWindowProc" */ break; + case WM_DISPLAYCHANGE: /* 0x007E */ + /* The system display resolution/depth has changed */ + fgDisplay.ScreenWidth = LOWORD(lParam); + fgDisplay.ScreenHeight = HIWORD(lParam); + break; + case WM_SYSCOMMAND : /* 0x0112 */ { /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-04-06 10:16:05
|
Revision: 1608 http://freeglut.svn.sourceforge.net/freeglut/?rev=1608&view=rev Author: dcnieho Date: 2013-04-06 10:15:53 +0000 (Sat, 06 Apr 2013) Log Message: ----------- added a function to translate WM_ messages to text, for debugging 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-04-06 10:15:19 UTC (rev 1607) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-04-06 10:15:53 UTC (rev 1608) @@ -62,7 +62,390 @@ struct GXKeyList gxKeyList; #endif /* _WIN32_WCE */ +#ifdef _DEBUG +/* + * WM_ message to string, for debugging + * This is taken from the 8.0 SDK, so Windows 8 API and everything earlier is included + */ +struct WM_MESSAGE_MAP +{ + UINT nMsg; + LPCSTR lpszMsg; +}; +#define DEFINE_MESSAGE(wm){ wm, #wm } +static struct WM_MESSAGE_MAP allMessages[] = +{ + DEFINE_MESSAGE(WM_NULL), + DEFINE_MESSAGE(WM_CREATE), + DEFINE_MESSAGE(WM_DESTROY), + DEFINE_MESSAGE(WM_MOVE), + DEFINE_MESSAGE(WM_SIZE), + DEFINE_MESSAGE(WM_ACTIVATE), + DEFINE_MESSAGE(WM_SETFOCUS), + DEFINE_MESSAGE(WM_KILLFOCUS), + DEFINE_MESSAGE(WM_ENABLE), + DEFINE_MESSAGE(WM_SETREDRAW), + DEFINE_MESSAGE(WM_SETTEXT), + DEFINE_MESSAGE(WM_GETTEXT), + DEFINE_MESSAGE(WM_GETTEXTLENGTH), + DEFINE_MESSAGE(WM_PAINT), + DEFINE_MESSAGE(WM_CLOSE), +# ifndef _WIN32_WCE + DEFINE_MESSAGE(WM_QUERYENDSESSION), + DEFINE_MESSAGE(WM_QUERYOPEN), + DEFINE_MESSAGE(WM_ENDSESSION), +# endif + DEFINE_MESSAGE(WM_QUIT), + DEFINE_MESSAGE(WM_ERASEBKGND), + DEFINE_MESSAGE(WM_SYSCOLORCHANGE), + DEFINE_MESSAGE(WM_SHOWWINDOW), + DEFINE_MESSAGE(WM_WININICHANGE), + + DEFINE_MESSAGE(WM_DEVMODECHANGE), + DEFINE_MESSAGE(WM_ACTIVATEAPP), + DEFINE_MESSAGE(WM_FONTCHANGE), + DEFINE_MESSAGE(WM_TIMECHANGE), + DEFINE_MESSAGE(WM_CANCELMODE), + DEFINE_MESSAGE(WM_SETCURSOR), + DEFINE_MESSAGE(WM_MOUSEACTIVATE), + DEFINE_MESSAGE(WM_CHILDACTIVATE), + DEFINE_MESSAGE(WM_QUEUESYNC), + + DEFINE_MESSAGE(WM_GETMINMAXINFO), + + DEFINE_MESSAGE(WM_PAINTICON), + DEFINE_MESSAGE(WM_ICONERASEBKGND), + DEFINE_MESSAGE(WM_NEXTDLGCTL), + DEFINE_MESSAGE(WM_SPOOLERSTATUS), + DEFINE_MESSAGE(WM_DRAWITEM), + DEFINE_MESSAGE(WM_MEASUREITEM), + DEFINE_MESSAGE(WM_DELETEITEM), + DEFINE_MESSAGE(WM_VKEYTOITEM), + DEFINE_MESSAGE(WM_CHARTOITEM), + DEFINE_MESSAGE(WM_SETFONT), + DEFINE_MESSAGE(WM_GETFONT), + DEFINE_MESSAGE(WM_SETHOTKEY), + DEFINE_MESSAGE(WM_GETHOTKEY), + DEFINE_MESSAGE(WM_QUERYDRAGICON), + DEFINE_MESSAGE(WM_COMPAREITEM), +# if(WINVER >= 0x0500) +# ifndef _WIN32_WCE + DEFINE_MESSAGE(WM_GETOBJECT), + # endif +# endif /* WINVER >= 0x0500 */ + DEFINE_MESSAGE(WM_COMPACTING), + DEFINE_MESSAGE(WM_COMMNOTIFY), + DEFINE_MESSAGE(WM_WINDOWPOSCHANGING), + DEFINE_MESSAGE(WM_WINDOWPOSCHANGED), + + DEFINE_MESSAGE(WM_POWER), + + DEFINE_MESSAGE(WM_COPYDATA), + DEFINE_MESSAGE(WM_CANCELJOURNAL), + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_NOTIFY), + DEFINE_MESSAGE(WM_INPUTLANGCHANGEREQUEST), + DEFINE_MESSAGE(WM_INPUTLANGCHANGE), + DEFINE_MESSAGE(WM_TCARD), + DEFINE_MESSAGE(WM_HELP), + DEFINE_MESSAGE(WM_USERCHANGED), + DEFINE_MESSAGE(WM_NOTIFYFORMAT), + + DEFINE_MESSAGE(WM_CONTEXTMENU), + DEFINE_MESSAGE(WM_STYLECHANGING), + DEFINE_MESSAGE(WM_STYLECHANGED), + DEFINE_MESSAGE(WM_DISPLAYCHANGE), + DEFINE_MESSAGE(WM_GETICON), + DEFINE_MESSAGE(WM_SETICON), +# endif /* WINVER >= 0x0400 */ + + DEFINE_MESSAGE(WM_NCCREATE), + DEFINE_MESSAGE(WM_NCDESTROY), + DEFINE_MESSAGE(WM_NCCALCSIZE), + DEFINE_MESSAGE(WM_NCHITTEST), + DEFINE_MESSAGE(WM_NCPAINT), + DEFINE_MESSAGE(WM_NCACTIVATE), + DEFINE_MESSAGE(WM_GETDLGCODE), +# ifndef _WIN32_WCE + DEFINE_MESSAGE(WM_SYNCPAINT), +# endif + DEFINE_MESSAGE(WM_NCMOUSEMOVE), + DEFINE_MESSAGE(WM_NCLBUTTONDOWN), + DEFINE_MESSAGE(WM_NCLBUTTONUP), + DEFINE_MESSAGE(WM_NCLBUTTONDBLCLK), + DEFINE_MESSAGE(WM_NCRBUTTONDOWN), + DEFINE_MESSAGE(WM_NCRBUTTONUP), + DEFINE_MESSAGE(WM_NCRBUTTONDBLCLK), + DEFINE_MESSAGE(WM_NCMBUTTONDOWN), + DEFINE_MESSAGE(WM_NCMBUTTONUP), + DEFINE_MESSAGE(WM_NCMBUTTONDBLCLK), + + + +# if(_WIN32_WINNT >= 0x0500) + DEFINE_MESSAGE(WM_NCXBUTTONDOWN), + DEFINE_MESSAGE(WM_NCXBUTTONUP), + DEFINE_MESSAGE(WM_NCXBUTTONDBLCLK), +# endif /* _WIN32_WINNT >= 0x0500 */ + + +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_INPUT_DEVICE_CHANGE), +# endif /* _WIN32_WINNT >= 0x0501 */ + +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_INPUT), +# endif /* _WIN32_WINNT >= 0x0501 */ + + DEFINE_MESSAGE(WM_KEYDOWN), + DEFINE_MESSAGE(WM_KEYUP), + DEFINE_MESSAGE(WM_CHAR), + DEFINE_MESSAGE(WM_DEADCHAR), + DEFINE_MESSAGE(WM_SYSKEYDOWN), + DEFINE_MESSAGE(WM_SYSKEYUP), + DEFINE_MESSAGE(WM_SYSCHAR), + DEFINE_MESSAGE(WM_SYSDEADCHAR), +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_UNICHAR), +# endif /* _WIN32_WINNT >= 0x0501 */ + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_IME_STARTCOMPOSITION), + DEFINE_MESSAGE(WM_IME_ENDCOMPOSITION), + DEFINE_MESSAGE(WM_IME_COMPOSITION), + DEFINE_MESSAGE(WM_IME_KEYLAST), +# endif /* WINVER >= 0x0400 */ + + DEFINE_MESSAGE(WM_INITDIALOG), + DEFINE_MESSAGE(WM_COMMAND), + DEFINE_MESSAGE(WM_SYSCOMMAND), + DEFINE_MESSAGE(WM_TIMER), + DEFINE_MESSAGE(WM_HSCROLL), + DEFINE_MESSAGE(WM_VSCROLL), + DEFINE_MESSAGE(WM_INITMENU), + DEFINE_MESSAGE(WM_INITMENUPOPUP), +# if(WINVER >= 0x0601) + DEFINE_MESSAGE(WM_GESTURE), + DEFINE_MESSAGE(WM_GESTURENOTIFY), +# endif /* WINVER >= 0x0601 */ + DEFINE_MESSAGE(WM_MENUSELECT), + DEFINE_MESSAGE(WM_MENUCHAR), + DEFINE_MESSAGE(WM_ENTERIDLE), +# if(WINVER >= 0x0500) +# ifndef _WIN32_WCE + DEFINE_MESSAGE(WM_MENURBUTTONUP), + DEFINE_MESSAGE(WM_MENUDRAG), + DEFINE_MESSAGE(WM_MENUGETOBJECT), + DEFINE_MESSAGE(WM_UNINITMENUPOPUP), + DEFINE_MESSAGE(WM_MENUCOMMAND), + +# if(_WIN32_WINNT >= 0x0500) + DEFINE_MESSAGE(WM_CHANGEUISTATE), + DEFINE_MESSAGE(WM_UPDATEUISTATE), + DEFINE_MESSAGE(WM_QUERYUISTATE), +# endif /* _WIN32_WINNT >= 0x0500 */ + +# endif +# endif /* WINVER >= 0x0500 */ + + DEFINE_MESSAGE(WM_CTLCOLORMSGBOX), + DEFINE_MESSAGE(WM_CTLCOLOREDIT), + DEFINE_MESSAGE(WM_CTLCOLORLISTBOX), + DEFINE_MESSAGE(WM_CTLCOLORBTN), + DEFINE_MESSAGE(WM_CTLCOLORDLG), + DEFINE_MESSAGE(WM_CTLCOLORSCROLLBAR), + DEFINE_MESSAGE(WM_CTLCOLORSTATIC), +# define MN_GETHMENU 0x01E1 + + DEFINE_MESSAGE(WM_MOUSEMOVE), + DEFINE_MESSAGE(WM_LBUTTONDOWN), + DEFINE_MESSAGE(WM_LBUTTONUP), + DEFINE_MESSAGE(WM_LBUTTONDBLCLK), + DEFINE_MESSAGE(WM_RBUTTONDOWN), + DEFINE_MESSAGE(WM_RBUTTONUP), + DEFINE_MESSAGE(WM_RBUTTONDBLCLK), + DEFINE_MESSAGE(WM_MBUTTONDOWN), + DEFINE_MESSAGE(WM_MBUTTONUP), + DEFINE_MESSAGE(WM_MBUTTONDBLCLK), +# if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) + DEFINE_MESSAGE(WM_MOUSEWHEEL), +# endif +# if (_WIN32_WINNT >= 0x0500) + DEFINE_MESSAGE(WM_XBUTTONDOWN), + DEFINE_MESSAGE(WM_XBUTTONUP), + DEFINE_MESSAGE(WM_XBUTTONDBLCLK), +# endif +# if (_WIN32_WINNT >= 0x0600) + DEFINE_MESSAGE(WM_MOUSEHWHEEL), +# endif + + + + DEFINE_MESSAGE(WM_PARENTNOTIFY), + DEFINE_MESSAGE(WM_ENTERMENULOOP), + DEFINE_MESSAGE(WM_EXITMENULOOP), + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_NEXTMENU), + DEFINE_MESSAGE(WM_SIZING), + DEFINE_MESSAGE(WM_CAPTURECHANGED), + DEFINE_MESSAGE(WM_MOVING), +# endif /* WINVER >= 0x0400 */ + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_POWERBROADCAST), + DEFINE_MESSAGE(WM_DEVICECHANGE), +# endif /* WINVER >= 0x0400 */ + + DEFINE_MESSAGE(WM_MDICREATE), + DEFINE_MESSAGE(WM_MDIDESTROY), + DEFINE_MESSAGE(WM_MDIACTIVATE), + DEFINE_MESSAGE(WM_MDIRESTORE), + DEFINE_MESSAGE(WM_MDINEXT), + DEFINE_MESSAGE(WM_MDIMAXIMIZE), + DEFINE_MESSAGE(WM_MDITILE), + DEFINE_MESSAGE(WM_MDICASCADE), + DEFINE_MESSAGE(WM_MDIICONARRANGE), + DEFINE_MESSAGE(WM_MDIGETACTIVE), + + + DEFINE_MESSAGE(WM_MDISETMENU), + DEFINE_MESSAGE(WM_ENTERSIZEMOVE), + DEFINE_MESSAGE(WM_EXITSIZEMOVE), + DEFINE_MESSAGE(WM_DROPFILES), + DEFINE_MESSAGE(WM_MDIREFRESHMENU), + +# if(WINVER >= 0x0602) + DEFINE_MESSAGE(WM_POINTERDEVICECHANGE), + DEFINE_MESSAGE(WM_POINTERDEVICEINRANGE), + DEFINE_MESSAGE(WM_POINTERDEVICEOUTOFRANGE), +# endif /* WINVER >= 0x0602 */ + +# if(WINVER >= 0x0601) + DEFINE_MESSAGE(WM_TOUCH), +# endif /* WINVER >= 0x0601 */ + +# if(WINVER >= 0x0602) + DEFINE_MESSAGE(WM_NCPOINTERUPDATE), + DEFINE_MESSAGE(WM_NCPOINTERDOWN), + DEFINE_MESSAGE(WM_NCPOINTERUP), + DEFINE_MESSAGE(WM_POINTERUPDATE), + DEFINE_MESSAGE(WM_POINTERDOWN), + DEFINE_MESSAGE(WM_POINTERUP), + DEFINE_MESSAGE(WM_POINTERENTER), + DEFINE_MESSAGE(WM_POINTERLEAVE), + DEFINE_MESSAGE(WM_POINTERACTIVATE), + DEFINE_MESSAGE(WM_POINTERCAPTURECHANGED), + DEFINE_MESSAGE(WM_TOUCHHITTESTING), + DEFINE_MESSAGE(WM_POINTERWHEEL), + DEFINE_MESSAGE(WM_POINTERHWHEEL), +# endif /* WINVER >= 0x0602 */ + + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_IME_SETCONTEXT), + DEFINE_MESSAGE(WM_IME_NOTIFY), + DEFINE_MESSAGE(WM_IME_CONTROL), + DEFINE_MESSAGE(WM_IME_COMPOSITIONFULL), + DEFINE_MESSAGE(WM_IME_SELECT), + DEFINE_MESSAGE(WM_IME_CHAR), +# endif /* WINVER >= 0x0400 */ +# if(WINVER >= 0x0500) + DEFINE_MESSAGE(WM_IME_REQUEST), +# endif /* WINVER >= 0x0500 */ +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_IME_KEYDOWN), + DEFINE_MESSAGE(WM_IME_KEYUP), +# endif /* WINVER >= 0x0400 */ + +# if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500)) + DEFINE_MESSAGE(WM_MOUSEHOVER), + DEFINE_MESSAGE(WM_MOUSELEAVE), +# endif +# if(WINVER >= 0x0500) + DEFINE_MESSAGE(WM_NCMOUSEHOVER), + DEFINE_MESSAGE(WM_NCMOUSELEAVE), +# endif /* WINVER >= 0x0500 */ + +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_WTSSESSION_CHANGE), +# endif /* _WIN32_WINNT >= 0x0501 */ + + DEFINE_MESSAGE(WM_CUT), + DEFINE_MESSAGE(WM_COPY), + DEFINE_MESSAGE(WM_PASTE), + DEFINE_MESSAGE(WM_CLEAR), + DEFINE_MESSAGE(WM_UNDO), + DEFINE_MESSAGE(WM_RENDERFORMAT), + DEFINE_MESSAGE(WM_RENDERALLFORMATS), + DEFINE_MESSAGE(WM_DESTROYCLIPBOARD), + DEFINE_MESSAGE(WM_DRAWCLIPBOARD), + DEFINE_MESSAGE(WM_PAINTCLIPBOARD), + DEFINE_MESSAGE(WM_VSCROLLCLIPBOARD), + DEFINE_MESSAGE(WM_SIZECLIPBOARD), + DEFINE_MESSAGE(WM_ASKCBFORMATNAME), + DEFINE_MESSAGE(WM_CHANGECBCHAIN), + DEFINE_MESSAGE(WM_HSCROLLCLIPBOARD), + DEFINE_MESSAGE(WM_QUERYNEWPALETTE), + DEFINE_MESSAGE(WM_PALETTEISCHANGING), + DEFINE_MESSAGE(WM_PALETTECHANGED), + DEFINE_MESSAGE(WM_HOTKEY), + +# if(WINVER >= 0x0400) + DEFINE_MESSAGE(WM_PRINT), + DEFINE_MESSAGE(WM_PRINTCLIENT), +# endif /* WINVER >= 0x0400 */ + +# if(_WIN32_WINNT >= 0x0500) + DEFINE_MESSAGE(WM_APPCOMMAND), +# endif /* _WIN32_WINNT >= 0x0500 */ + +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_THEMECHANGED), +# endif /* _WIN32_WINNT >= 0x0501 */ + + +# if(_WIN32_WINNT >= 0x0501) + DEFINE_MESSAGE(WM_CLIPBOARDUPDATE), +# endif /* _WIN32_WINNT >= 0x0501 */ + +# if(_WIN32_WINNT >= 0x0600) + DEFINE_MESSAGE(WM_DWMCOMPOSITIONCHANGED), + DEFINE_MESSAGE(WM_DWMNCRENDERINGCHANGED), + DEFINE_MESSAGE(WM_DWMCOLORIZATIONCOLORCHANGED), + DEFINE_MESSAGE(WM_DWMWINDOWMAXIMIZEDCHANGE), +# endif /* _WIN32_WINNT >= 0x0600 */ + +# if(_WIN32_WINNT >= 0x0601) + DEFINE_MESSAGE(WM_DWMSENDICONICTHUMBNAIL), + DEFINE_MESSAGE(WM_DWMSENDICONICLIVEPREVIEWBITMAP), +# endif /* _WIN32_WINNT >= 0x0601 */ + + +# if(WINVER >= 0x0600) + DEFINE_MESSAGE(WM_GETTITLEBARINFOEX), +# endif /* WINVER >= 0x0600 */ + { 0, NULL, } /* end of message list */ +}; +#undef DEFINE_MESSAGE + +char* WMMsg2Str(DWORD dwMessage) +{ + struct WM_MESSAGE_MAP* pMapMsg = allMessages; + for (/*null*/; pMapMsg->lpszMsg != NULL; pMapMsg++) + { + if (pMapMsg->nMsg == dwMessage ) + { + return (char *)pMapMsg->lpszMsg; + } + } + return ""; +} +#endif /* _DEBUG */ + + /* Get system time, taking special precautions against 32bit timer wrap. We use timeGetTime and not GetTickCount because of its better stability, and because we can increase its granularity (to 1 ms in @@ -395,8 +778,8 @@ if ( ( window == NULL ) && ( uMsg != WM_CREATE ) ) return DefWindowProc( hWnd, uMsg, wParam, lParam ); - /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, - uMsg, wParam, lParam ); */ + /* printf ( "Window %3d message %s (<%04x>) %12d %12d\n", window?window->ID:0, + WMMsg2Str(uMsg), uMsg, wParam, lParam ); */ switch( uMsg ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-04-06 10:16:38
|
Revision: 1609 http://freeglut.svn.sourceforge.net/freeglut/?rev=1609&view=rev Author: dcnieho Date: 2013-04-06 10:16:27 +0000 (Sat, 06 Apr 2013) Log Message: ----------- now that menu's no longer take focus from their parent, clicking the non-client area of the parent no longer closed the menu. 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-04-06 10:15:53 UTC (rev 1608) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-04-06 10:16:27 UTC (rev 1609) @@ -983,6 +983,20 @@ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); break; + case WM_NCLBUTTONDOWN: + case WM_NCMBUTTONDOWN: + case WM_NCRBUTTONDOWN: + { + SFG_Menu *menu; + if (fgStructure.Menus.First && (menu = fgGetActiveMenu())) + /* user clicked non-client area of window while a menu is open. Close menu */ + fgDeactivateMenu(menu->ParentWindow); + + /* and always pass to DefWindowProc */ + lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); + } + break; + #if 0 case WM_ACTIVATE: /* printf("WM_ACTIVATE: %x (ID: %i) %d %d\n",lParam, window->ID, HIWORD(wParam), LOWORD(wParam)); */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2013-11-09 05:33:05
|
Revision: 1627 http://sourceforge.net/p/freeglut/code/1627 Author: dcnieho Date: 2013-11-09 05:33:02 +0000 (Sat, 09 Nov 2013) Log Message: ----------- Fixing problem with non-client area becoming unresponsive on Windows due to mouse capture that isn't released. Thanks Philipp Kutin (on list!) for figuring this out and proposing a solution. -> It appears GetAsyncKeyState's return can be non-zero even when the queried key is not pressed 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-08-28 14:33:07 UTC (rev 1626) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2013-11-09 05:33:02 UTC (rev 1627) @@ -578,6 +578,18 @@ ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); } +/* Check whether a button (VK_*BUTTON) is currently depressed. Returns + * non-zero (not necessarily 1) if yes. */ +static SHORT fgGetAsyncKeyState(int vKey) +{ + /* MSDN says: "If the most significant bit is set, the key is down, and if + * the least significant bit is set, the key was pressed after the previous + * call to GetAsyncKeyState." This behavior cannot be relied upon however. + * Remove this bit so that we can simply test with ! if key is up. + */ + return GetAsyncKeyState(vKey) & ~1; +} + static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) { static unsigned char lControl = 0, lShift = 0, lAlt = 0, @@ -629,12 +641,12 @@ * 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 ))\ + if (!keyStateVar && fgGetAsyncKeyState ( winKey ))\ {\ keypress = glutKey;\ keyStateVar = 1;\ }\ - else if (keyStateVar && !GetAsyncKeyState ( winKey ))\ + else if (keyStateVar && !fgGetAsyncKeyState ( winKey ))\ {\ keypress = glutKey;\ keyStateVar = 0;\ @@ -1237,7 +1249,7 @@ SetCapture ( window->Window.Handle ) ; setCaptureActive = 1; /* Set to false in WM_CAPTURECHANGED handler */ } - else if (!GetAsyncKeyState(VK_LBUTTON) && !GetAsyncKeyState(VK_MBUTTON) && !GetAsyncKeyState(VK_RBUTTON)) + else if (!fgGetAsyncKeyState(VK_LBUTTON) && !fgGetAsyncKeyState(VK_MBUTTON) && !fgGetAsyncKeyState(VK_RBUTTON)) /* Make sure all mouse buttons are released before releasing capture */ ReleaseCapture () ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2014-01-22 12:07:03
|
Revision: 1642 http://sourceforge.net/p/freeglut/code/1642 Author: dcnieho Date: 2014-01-22 12:06:59 +0000 (Wed, 22 Jan 2014) Log Message: ----------- should be using GetKeyState not GetAsyncKeyState to check for modifier keys as we care which modifiers were active at the time of the key/mouse press we are processing 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 2014-01-22 10:09:57 UTC (rev 1641) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2014-01-22 12:06:59 UTC (rev 1642) @@ -580,14 +580,10 @@ /* Check whether a button (VK_*BUTTON) is currently depressed. Returns * non-zero (not necessarily 1) if yes. */ -static SHORT fgGetAsyncKeyState(int vKey) +static SHORT fgGetKeyState(int vKey) { - /* MSDN says: "If the most significant bit is set, the key is down, and if - * the least significant bit is set, the key was pressed after the previous - * call to GetAsyncKeyState." This behavior cannot be relied upon however. - * Remove this bit so that we can simply test with ! if key is up. - */ - return GetAsyncKeyState(vKey) & ~1; + /* MSDN says: "If the high-order bit is 1, the key is down; otherwise, it is up". */ + return GetKeyState(vKey) & 0xFF00; } static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam) @@ -640,30 +636,30 @@ * 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 && fgGetAsyncKeyState ( winKey ))\ +#define KEY_EVENT(winKey,glutKey,keyStateVar)\ + if (!keyStateVar && fgGetKeyState ( winKey ))\ {\ keypress = glutKey;\ keyStateVar = 1;\ }\ - else if (keyStateVar && !fgGetAsyncKeyState ( winKey ))\ + else if (keyStateVar && !fgGetKeyState ( 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); + KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl); + 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); + KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift); + 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); + KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt); + KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt); break; -#undef ASYNC_KEY_EVENT +#undef KEY_EVENT case VK_DELETE: /* The delete key should be treated as an ASCII keypress: */ @@ -1249,7 +1245,7 @@ SetCapture ( window->Window.Handle ) ; setCaptureActive = 1; /* Set to false in WM_CAPTURECHANGED handler */ } - else if (!fgGetAsyncKeyState(VK_LBUTTON) && !fgGetAsyncKeyState(VK_MBUTTON) && !fgGetAsyncKeyState(VK_RBUTTON)) + else if (!fgGetKeyState(VK_LBUTTON) && !fgGetKeyState(VK_MBUTTON) && !fgGetKeyState(VK_RBUTTON)) /* Make sure all mouse buttons are released before releasing capture */ ReleaseCapture () ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2014-05-14 22:02:45
|
Revision: 1683 http://sourceforge.net/p/freeglut/code/1683 Author: dcnieho Date: 2014-05-14 22:02:41 +0000 (Wed, 14 May 2014) Log Message: ----------- KEY_EVENT macro exists in windows 8.1 API: renamed it. Also renamed KEY macro to be safe. 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 2014-05-14 18:31:58 UTC (rev 1682) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2014-05-14 22:02:41 UTC (rev 1683) @@ -606,37 +606,37 @@ fgState.Modifiers = fgPlatformGetModifiers( ); /* Convert the Win32 keystroke codes to GLUTtish way */ -# define KEY(a,b) case a: keypress = b; break; +# define FG_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 ); + FG_KEY( VK_F1, GLUT_KEY_F1 ); + FG_KEY( VK_F2, GLUT_KEY_F2 ); + FG_KEY( VK_F3, GLUT_KEY_F3 ); + FG_KEY( VK_F4, GLUT_KEY_F4 ); + FG_KEY( VK_F5, GLUT_KEY_F5 ); + FG_KEY( VK_F6, GLUT_KEY_F6 ); + FG_KEY( VK_F7, GLUT_KEY_F7 ); + FG_KEY( VK_F8, GLUT_KEY_F8 ); + FG_KEY( VK_F9, GLUT_KEY_F9 ); + FG_KEY( VK_F10, GLUT_KEY_F10 ); + FG_KEY( VK_F11, GLUT_KEY_F11 ); + FG_KEY( VK_F12, GLUT_KEY_F12 ); + FG_KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); + FG_KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); + FG_KEY( VK_HOME, GLUT_KEY_HOME ); + FG_KEY( VK_END, GLUT_KEY_END ); + FG_KEY( VK_LEFT, GLUT_KEY_LEFT ); + FG_KEY( VK_UP, GLUT_KEY_UP ); + FG_KEY( VK_RIGHT, GLUT_KEY_RIGHT ); + FG_KEY( VK_DOWN, GLUT_KEY_DOWN ); + FG_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 KEY_EVENT(winKey,glutKey,keyStateVar)\ +#define FG_KEY_EVENT(winKey,glutKey,keyStateVar)\ if (!keyStateVar && fgGetKeyState ( winKey ))\ {\ keypress = glutKey;\ @@ -648,16 +648,16 @@ keyStateVar = 0;\ } case VK_CONTROL: - KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl); - KEY_EVENT(VK_RCONTROL,GLUT_KEY_CTRL_R,rControl); + FG_KEY_EVENT(VK_LCONTROL,GLUT_KEY_CTRL_L,lControl); + FG_KEY_EVENT(VK_RCONTROL,GLUT_KEY_CTRL_R,rControl); break; case VK_SHIFT: - KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift); - KEY_EVENT(VK_RSHIFT,GLUT_KEY_SHIFT_R,rShift); + FG_KEY_EVENT(VK_LSHIFT,GLUT_KEY_SHIFT_L,lShift); + FG_KEY_EVENT(VK_RSHIFT,GLUT_KEY_SHIFT_R,rShift); break; case VK_MENU: - KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt); - KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt); + FG_KEY_EVENT(VK_LMENU,GLUT_KEY_ALT_L,lAlt); + FG_KEY_EVENT(VK_RMENU,GLUT_KEY_ALT_R,rAlt); break; #undef KEY_EVENT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2014-10-12 06:37:07
|
Revision: 1711 http://sourceforge.net/p/freeglut/code/1711 Author: dcnieho Date: 2014-10-12 06:37:00 +0000 (Sun, 12 Oct 2014) Log Message: ----------- change some initializer use that some compilers choke on (even that technically may a bug in the compiler, I think) 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 2014-10-12 06:21:32 UTC (rev 1710) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2014-10-12 06:37:00 UTC (rev 1711) @@ -752,7 +752,9 @@ /* Get mouse position at time of message */ DWORD mouse_pos_dw = GetMessagePos(); - POINT mouse_pos = {GET_X_LPARAM(mouse_pos_dw), GET_Y_LPARAM(mouse_pos_dw)}; + POINT mouse_pos; + mouse_pos.x = GET_X_LPARAM(mouse_pos_dw); + mouse_pos.y = GET_Y_LPARAM(mouse_pos_dw); ScreenToClient( window->Window.Handle, &mouse_pos ); hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); @@ -947,7 +949,9 @@ /* For child window, we should return relative to upper-left * of parent's client area. */ - POINT topleft = {windowRect.left,windowRect.top}; + POINT topleft; + topleft.x = windowRect.left; + topleft.y = windowRect.top; ScreenToClient(window->Parent->Window.Handle,&topleft); windowRect.left = topleft.x; @@ -1763,4 +1767,4 @@ } ShowWindow( win->Window.Handle, cmdShow ); -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dc...@us...> - 2014-10-18 16:22:47
|
Revision: 1720 http://sourceforge.net/p/freeglut/code/1720 Author: dcnieho Date: 2014-10-18 16:22:39 +0000 (Sat, 18 Oct 2014) Log Message: ----------- small simplification 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 2014-10-17 16:38:40 UTC (rev 1719) +++ trunk/freeglut/freeglut/src/mswin/fg_main_mswin.c 2014-10-18 16:22:39 UTC (rev 1720) @@ -1640,8 +1640,7 @@ /* For fullscreen mode, find the monitor that is covered the most * by the window and get its rect as the resize target. */ - GetWindowRect(window->Window.Handle, &rect); - hMonitor= MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST); + hMonitor= MonitorFromWindow(window->Window.Handle, MONITOR_DEFAULTTONEAREST); mi.cbSize = sizeof(mi); GetMonitorInfo(hMonitor, &mi); rect = mi.rcMonitor; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |