return 1;
}
-static SFG_Window* fghWindowUnderCursor(SFG_Window *window)
+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,
*/
if (window && window->Children.First) /* This window has childs */
{
- SFG_WindowHandleType hwnd;
+ HWND hwnd;
SFG_Window* child_window;
/* Get mouse position at time of message */
#endif /* defined(_WIN32_WCE) */
if (width!=window->State.Width || height!=window->State.Height)
- /* Something changed, need to resize */
- window->State.NeedToResize = GL_TRUE;
+ {
+ SFG_Window* saved_window = fgStructure.CurrentWindow;
+
+ /* size changed, call reshape callback */
+ INVOKE_WCB( *window, Reshape, ( width, height ) );
+ glutPostRedisplay( );
+ if( window->IsMenu )
+ fgSetWindow( saved_window );
+ }
}
/* according to docs, should return 0 */
break;
case WM_SETFOCUS:
-/* printf("WM_SETFOCUS: %p\n", window ); */
-
+ /*printf("WM_SETFOCUS: %p\n", window );*/
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
SetActiveWindow( window->Window.Handle );
break;
case WM_KILLFOCUS:
- {
-/* printf("WM_KILLFOCUS: %p\n", window ); */
- lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+ /*printf("WM_KILLFOCUS: %p\n", window ); */
+ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
- /* Check if there are any open menus that need to be closed */
- fgPlatformCheckMenuDeactivate();
- }
+ /* Check if there are any open menus that need to be closed */
+ fgPlatformCheckMenuDeactivate();
break;
#if 0
*/
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;
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 );
+ RECT rect;
+
+ 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 );
+ }
+ lRet = 0; /* As per docs, should return 0 */
}
break;
case WM_MOUSEMOVE:
{
+ /* Per docs, use LOWORD/HIWORD for WinCE and GET_X_LPARAM/GET_Y_LPARAM for desktop windows */
#if defined(_WIN32_WCE)
- window->State.MouseX = 320-HIWORD( lParam );
+ window->State.MouseX = 320-HIWORD( lParam ); /* XXX: Docs say x should be loword and y hiword? */
window->State.MouseY = LOWORD( lParam );
#else
- window->State.MouseX = LOWORD( lParam );
- window->State.MouseY = HIWORD( lParam );
+ window->State.MouseX = GET_X_LPARAM( lParam );
+ window->State.MouseY = GET_Y_LPARAM( lParam );
#endif /* defined(_WIN32_WCE) */
/* Restrict to [-32768, 32767] to match X11 behaviour */
/* See comment in "freeglut_developer" mailing list 10/4/04 */
GLboolean pressed = GL_TRUE;
int button;
+ /* Per docs, use LOWORD/HIWORD for WinCE and GET_X_LPARAM/GET_Y_LPARAM for desktop windows */
#if defined(_WIN32_WCE)
- window->State.MouseX = 320-HIWORD( lParam );
+ window->State.MouseX = 320-HIWORD( lParam ); /* XXX: Docs say x should be loword and y hiword? */
window->State.MouseY = LOWORD( lParam );
#else
- window->State.MouseX = LOWORD( lParam );
- window->State.MouseY = HIWORD( lParam );
+ window->State.MouseX = GET_X_LPARAM( lParam );
+ window->State.MouseY = GET_Y_LPARAM( lParam );
#endif /* defined(_WIN32_WCE) */
/* Restrict to [-32768, 32767] to match X11 behaviour */
case WM_MOUSEWHEEL:
{
- SFG_Window *child_window = NULL;
int wheel_number = 0; /* Only one scroll wheel on windows */
- /* int GET_KEYSTATE_WPARAM( wParam ); */
+#if defined(_WIN32_WCE)
+ int modkeys = LOWORD(wParam);
+ short ticks = (short)HIWORD(wParam);
+ /* commented out as should not be needed here, mouse motion is processed in WM_MOUSEMOVE first:
+ xPos = LOWORD(lParam); -- straight from docs, not consistent with mouse nutton and mouse motion above (which i think is wrong)
+ yPos = HIWORD(lParam);
+ */
+#else
+ /* int modkeys = GET_KEYSTATE_WPARAM( wParam ); */
short ticks = GET_WHEEL_DELTA_WPARAM( wParam );
+ /* commented out as should not be needed here, mouse motion is processed in WM_MOUSEMOVE first:
+ window->State.MouseX = GET_X_LPARAM( lParam );
+ window->State.MouseY = GET_Y_LPARAM( lParam );
+ */
+#endif /* defined(_WIN32_WCE) */
window = fghWindowUnderCursor(window);
lRet = 0; /* Per docs, should return zero */
break;
- /* Other messages that I have seen and which are not handled already */
- case WM_SETTEXT: /* 0x000c */
- lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
- /* Pass it on to "DefWindowProc" to set the window text */
- break;
-
- case WM_GETTEXT: /* 0x000d */
- /* Ideally we would copy the title of the window into "lParam" */
- /* strncpy ( (char *)lParam, "Window Title", wParam );
- lRet = ( wParam > 12 ) ? 12 : wParam; */
- /* the number of characters copied */
- lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
- break;
-
- case WM_GETTEXTLENGTH: /* 0x000e */
- /* Ideally we would get the length of the title of the window */
- lRet = 12;
- /* the number of characters in "Window Title\0" (see above) */
- break;
-
- case WM_ERASEBKGND: /* 0x0014 */
- lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
- break;
-
#if !defined(_WIN32_WCE)
case WM_SYNCPAINT: /* 0x0088 */
/* Another window has moved, need to update this one */
/* Help screen says this message must be passed to "DefWindowProc" */
break;
- case WM_NCPAINT: /* 0x0085 */
- /* Need to update the border of this window */
- lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
- /* Pass it on to "DefWindowProc" to repaint a standard border */
- break;
-
case WM_SYSCOMMAND : /* 0x0112 */
{
/*