//--------------------------------------------------------------------------------// OSStatus WindowEventUtilities::_CarbonWindowHandler(EventHandlerCallRef nextHandler, EventRef event, void* wnd) { OSStatus status = noErr; // Only events from our window should make it here // This ensures that our user data is our WindowRef RenderWindow* curWindow = (RenderWindow*)wnd; if(!curWindow) return eventNotHandledErr; //Iterator of all listeners registered to this RenderWindow WindowEventListeners::iterator index, start = _msListeners.lower_bound(curWindow), end = _msListeners.upper_bound(curWindow); // We only get called if a window event happens UInt32 eventKind = GetEventKind( event ); LogManager* log = LogManager::getSingletonPtr(); switch( eventKind ) { case kEventWindowActivated: curWindow->setActive( true ); for( ; start != end; ++start ) (start->second)->windowFocusChange(curWindow); break; case kEventWindowDeactivated: if( curWindow->isDeactivatedOnFocusChange() ) { curWindow->setActive( false ); } for( ; start != end; ++start ) (start->second)->windowFocusChange(curWindow); break; case kEventWindowShown: case kEventWindowExpanded: curWindow->setActive( true ); curWindow->setVisible( true ); for( ; start != end; ++start ) (start->second)->windowFocusChange(curWindow); break; case kEventWindowHidden: case kEventWindowCollapsed: curWindow->setActive( false ); curWindow->setVisible( false ); for( ; start != end; ++start ) (start->second)->windowFocusChange(curWindow); break; case kEventWindowDragCompleted: curWindow->windowMovedOrResized(); for( ; start != end; ++start ) (start->second)->windowMoved(curWindow); break; case kEventWindowBoundsChanged: curWindow->windowMovedOrResized(); for( ; start != end; ++start ) (start->second)->windowResized(curWindow); break; case kEventWindowClosed: curWindow->destroy(); for( ; start != end; ++start ) (start->second)->windowClosed(curWindow); break; default: status = eventNotHandledErr; break; } return status; }
//--------------------------------------------------------------------------------// LRESULT CALLBACK WindowEventUtilities::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CREATE) { // Store pointer to Win32Window in user data area SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(((LPCREATESTRUCT)lParam)->lpCreateParams)); return 0; } // look up window instance // note: it is possible to get a WM_SIZE before WM_CREATE RenderWindow* win = (RenderWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (!win) return DefWindowProc(hWnd, uMsg, wParam, lParam); //LogManager* log = LogManager::getSingletonPtr(); //Iterator of all listeners registered to this RenderWindow WindowEventListeners::iterator index, start = _msListeners.lower_bound(win), end = _msListeners.upper_bound(win); switch( uMsg ) { case WM_ACTIVATE: { bool active = (LOWORD(wParam) != WA_INACTIVE); if( active ) { win->setActive( true ); } else { if( win->isDeactivatedOnFocusChange() ) { win->setActive( false ); } } for( ; start != end; ++start ) (start->second)->windowFocusChange(win); break; } case WM_SYSKEYDOWN: switch( wParam ) { case VK_CONTROL: case VK_SHIFT: case VK_MENU: //ALT //return zero to bypass defProc and signal we processed the message return 0; } break; case WM_SYSKEYUP: switch( wParam ) { case VK_CONTROL: case VK_SHIFT: case VK_MENU: //ALT case VK_F10: //return zero to bypass defProc and signal we processed the message return 0; } break; case WM_SYSCHAR: // return zero to bypass defProc and signal we processed the message, unless it's an ALT-space if (wParam != VK_SPACE) return 0; break; case WM_ENTERSIZEMOVE: //log->logMessage("WM_ENTERSIZEMOVE"); break; case WM_EXITSIZEMOVE: //log->logMessage("WM_EXITSIZEMOVE"); break; case WM_MOVE: //log->logMessage("WM_MOVE"); win->windowMovedOrResized(); for(index = start; index != end; ++index) (index->second)->windowMoved(win); break; case WM_DISPLAYCHANGE: win->windowMovedOrResized(); for(index = start; index != end; ++index) (index->second)->windowResized(win); break; case WM_SIZE: //log->logMessage("WM_SIZE"); win->windowMovedOrResized(); for(index = start; index != end; ++index) (index->second)->windowResized(win); break; case WM_GETMINMAXINFO: // Prevent the window from going smaller than some minimu size ((MINMAXINFO*)lParam)->ptMinTrackSize.x = 100; ((MINMAXINFO*)lParam)->ptMinTrackSize.y = 100; break; case WM_CLOSE: { //log->logMessage("WM_CLOSE"); bool close = true; for(index = start; index != end; ++index) { if (!(index->second)->windowClosing(win)) close = false; } if (!close) return 0; for(index = _msListeners.lower_bound(win); index != end; ++index) (index->second)->windowClosed(win); win->destroy(); return 0; } } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }