void Window::configExit( ) { if( !_xDisplay ) return; leaveNVSwapBarrier(); configExitFBO(); exitGLEW(); glXMakeCurrent( _xDisplay, None, 0 ); GLXContext context = getGLXContext(); XID drawable = getXDrawable(); setGLXContext( 0 ); setXDrawable( 0 ); XSync( _xDisplay, False ); // WAR assert in glXDestroyContext/xcb_io.c:183 if( context ) glXDestroyContext( _xDisplay, context ); if( drawable ) { if( getIAttribute( eq::Window::IATTR_HINT_DRAWABLE ) == PBUFFER ) glXDestroyPbuffer( _xDisplay, drawable ); else XDestroyWindow( _xDisplay, drawable ); } EQINFO << "Destroyed GLX context and X drawable " << std::endl; }
bool Window::processEvent( const WindowEvent& event ) { switch( event.type ) { case Event::WINDOW_POINTER_BUTTON_PRESS: if( getIAttribute( IATTR_HINT_GRAB_POINTER ) == ON && getIAttribute( IATTR_HINT_DRAWABLE ) == WINDOW && // If no other button was pressed already, capture the mouse event.pointerButtonPress.buttons == event.pointerButtonPress.button) { const unsigned int eventMask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask; const int result = XGrabPointer( getXDisplay(), getXDrawable(), False, eventMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime ); if( result == GrabSuccess ) { WindowEvent grabEvent = event; grabEvent.type = Event::WINDOW_POINTER_GRAB; processEvent( grabEvent ); } else { LBWARN << "Failed to grab mouse: XGrabPointer returned " << result << std::endl; } } break; case Event::WINDOW_POINTER_BUTTON_RELEASE: if( getIAttribute( IATTR_HINT_GRAB_POINTER ) == ON && getIAttribute( IATTR_HINT_DRAWABLE ) == WINDOW && // If no button is pressed anymore, release the mouse event.pointerButtonRelease.buttons == PTR_BUTTON_NONE ) { // Call early for consistent ordering const bool result = SystemWindow::processEvent( event ); WindowEvent ungrabEvent = event; ungrabEvent.type = Event::WINDOW_POINTER_UNGRAB; processEvent( ungrabEvent ); XUngrabPointer( getXDisplay(), CurrentTime ); return result; } break; } return SystemWindow::processEvent( event ); }