void Window::configExit() { WindowRef window = getCarbonWindow(); setCarbonWindow( 0 ); AGLContext context = getAGLContext(); if( getIAttribute( WindowSettings::IATTR_HINT_FULLSCREEN ) == ON ) { LBASSERT( !window ); exitEventHandler(); } else if( window ) { Global::enterCarbon(); aglSetWindowRef( context, 0 ); DisposeWindow( window ); Global::leaveCarbon(); } configExitFBO(); exitGLEW(); if( context ) { Global::enterCarbon(); aglSetCurrentContext( 0 ); aglDestroyContext( context ); Global::leaveCarbon(); setAGLContext( 0 ); } LBVERB << "Destroyed AGL window and context" << std::endl; }
void Window::setXDrawable( XID drawable ) { if( _xDrawable == drawable ) return; if( _xDrawable ) exitEventHandler(); _xDrawable = drawable; if( !drawable ) return; initEventHandler(); // query pixel viewport of window EQASSERT( _xDisplay ); switch( getIAttribute( eq::Window::IATTR_HINT_DRAWABLE )) { case PBUFFER: { unsigned width = 0; unsigned height = 0; glXQueryDrawable( _xDisplay, drawable, GLX_WIDTH, &width ); glXQueryDrawable( _xDisplay, drawable, GLX_HEIGHT, &height ); getWindow()->setPixelViewport( PixelViewport( 0, 0, int32_t( width ), int32_t( height ))); break; } case WINDOW: { XWindowAttributes wa; XGetWindowAttributes( _xDisplay, drawable, &wa ); // position is relative to parent: translate to absolute coords ::Window root, parent, *children; unsigned nChildren; XQueryTree( _xDisplay, drawable, &root, &parent, &children, &nChildren ); if( children != 0 ) XFree( children ); int x,y; ::Window childReturn; XTranslateCoordinates( _xDisplay, parent, root, wa.x, wa.y, &x, &y, &childReturn ); getWindow()->setPixelViewport( PixelViewport( x, y, wa.width, wa.height )); break; } default: EQUNIMPLEMENTED; case FBO: EQASSERT( getWindow()->getPixelViewport().hasArea( )); } }
void Window::setCarbonWindow( WindowRef window ) { LBVERB << "set Carbon window " << window << std::endl; if( _impl->carbonWindow == window ) return; if( _impl->carbonWindow ) exitEventHandler(); _impl->carbonWindow = window; if( !window ) return; if( getIAttribute( WindowSettings::IATTR_HINT_DRAWABLE ) == OFF ) return; initEventHandler(); Rect rect; Global::enterCarbon(); if( GetWindowBounds( window, kWindowContentRgn, &rect ) == noErr ) { PixelViewport pvp( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top ); if( getIAttribute( WindowSettings::IATTR_HINT_DECORATION ) != OFF ) pvp.y -= EQ_AGL_MENUBARHEIGHT; setPixelViewport( pvp ); } Global::leaveCarbon(); }
void Window::setXDrawable( XID drawable ) { LBASSERT( _impl->xDisplay ); if( _impl->xDrawable == drawable ) return; if( _impl->xDrawable ) exitEventHandler(); _impl->xDrawable = drawable; if( !drawable ) return; const int32_t drawableType = getIAttribute( IATTR_HINT_DRAWABLE ); if( drawableType != OFF ) initEventHandler(); // query pixel viewport of window switch( drawableType ) { case PBUFFER: { unsigned width = 0; unsigned height = 0; glXQueryDrawable( _impl->xDisplay, drawable, GLX_WIDTH, &width ); glXQueryDrawable( _impl->xDisplay, drawable, GLX_HEIGHT, &height ); setPixelViewport( PixelViewport( 0, 0, int32_t( width ), int32_t( height ))); break; } case WINDOW: case AUTO: case UNDEFINED: { XWindowAttributes wa; XGetWindowAttributes( _impl->xDisplay, drawable, &wa ); // position is relative to parent: translate to absolute coords ::Window root, parent, *children; unsigned nChildren; XQueryTree( _impl->xDisplay, drawable, &root, &parent, &children, &nChildren ); if( children != 0 ) XFree( children ); int x,y; ::Window childReturn; XTranslateCoordinates( _impl->xDisplay, parent, root, wa.x, wa.y, &x, &y, &childReturn ); setPixelViewport( PixelViewport( x, y, wa.width, wa.height )); break; } default: LBERROR << "Unknown drawable type " << drawableType << std::endl; LBUNIMPLEMENTED; case OFF: case FBO: LBASSERT( getPixelViewport().hasArea( )); } }