void createRenderWindow() { // Initialise Ogre without creating a window. mRoot->initialise(false); Ogre::NameValuePairList misc; // Tell Ogre to use the current GL context. This works on Linux/GLX but // you *will* need something different on Windows or Mac. misc["currentGLContext"] = String("True"); int w = al_get_display_width(); int h = al_get_display_height(); mWindow = mRoot->createRenderWindow("MainRenderWindow", w, h, false, &misc); mWindow->setVisible(true); }
//--------------------------------------------------------------------------------// 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; }
//--------------------------------------------------------------------------------// void GLXProc( const XEvent &event ) { //We have to find appropriate window based on window id ( kindof hackish :/, //but at least this only happens when there is a Window's event - and not that often WindowEventUtilities::Windows::iterator i = WindowEventUtilities::_msWindows.begin(), e = WindowEventUtilities::_msWindows.end(); RenderWindow* win = 0; for(; i != e; ++i ) { std::size_t wind = 0; (*i)->getCustomAttribute("WINDOW", &wind); if( event.xany.window == wind ) { win = *i; break; } } //Sometimes, seems we get other windows, so just ignore if( win == 0 ) return; //Now that we have the correct RenderWindow for the generated Event, get an iterator for the listeners WindowEventUtilities::WindowEventListeners::iterator start = WindowEventUtilities::_msListeners.lower_bound(win), end = WindowEventUtilities::_msListeners.upper_bound(win); switch(event.type) { case ClientMessage: { ::Atom atom; win->getCustomAttribute("ATOM", &atom); if(event.xclient.format == 32 && event.xclient.data.l[0] == (long)atom) { //Window Closed (via X button) //Send message first, to allow app chance to unregister things that need done before //window is shutdown for( ; start != end; ++start ) (start->second)->windowClosed(win); win->destroy(); } break; } case ConfigureNotify: //Moving or Resizing unsigned int width, height, depth; int left, top; win->getMetrics(width, height, depth, left, top); //determine if moving or sizing: if( left == event.xconfigure.x && top == event.xconfigure.y ) { //Resize width, height win->windowMovedOrResized(); for( ; start != end; ++start ) (start->second)->windowResized(win); } else if( width == event.xconfigure.width && height == event.xconfigure.height ) { //Moving x, y win->windowMovedOrResized(); for( ; start != end; ++start ) (start->second)->windowMoved(win); } break; case MapNotify: //Restored win->setActive( true ); for( ; start != end; ++start ) (start->second)->windowFocusChange(win); break; case UnmapNotify: //Minimised win->setActive( false ); win->setVisible( false ); for( ; start != end; ++start ) (start->second)->windowFocusChange(win); break; case VisibilityNotify: switch(event.xvisibility.state) { case VisibilityUnobscured: win->setActive( true ); win->setVisible( true ); break; case VisibilityPartiallyObscured: win->setActive( true ); win->setVisible( true ); break; case VisibilityFullyObscured: win->setActive( false ); win->setVisible( false ); break; } //Notify Listeners that focus of window has changed in some way for( ; start != end; ++start ) (start->second)->windowFocusChange(win); break; default: break; } //End switch event.type }