Index: source/Irrlicht/CIrrDeviceLinux.cpp =================================================================== --- source/Irrlicht/CIrrDeviceLinux.cpp (revision 122) +++ source/Irrlicht/CIrrDeviceLinux.cpp (working copy) @@ -45,7 +45,7 @@ bool sbuffer, bool vsync, bool antiAlias, IEventReceiver* receiver, const char* version) - : CIrrDeviceStub(version, receiver), close(false), DriverType(driverType), + : CIrrDeviceStub(version, receiver), Close(false), WindowActive(false), DriverType(driverType), Fullscreen(fullscreen), StencilBuffer(sbuffer), SoftwareImage(0) { #ifdef _DEBUG @@ -219,70 +219,86 @@ if (glXQueryExtension(display,&major,&minor) && glXQueryVersion(display, &major, &minor)) { - // no double buffer, 4 bits per color, 16 bit zbuffer - int visualAttrNoDoubleBuffer[] = - { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_RED_SIZE, 4, - GLX_GREEN_SIZE, 4, - GLX_BLUE_SIZE, 4, - GLX_ALPHA_SIZE, 4, - GLX_DEPTH_SIZE, 16, - None - }; - - // doublebuffer, 4 bits per color, 16bit zbuffer - int visualAttrDoubleBuffer[] = - { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DOUBLEBUFFER, True, - GLX_RED_SIZE, 4, - GLX_GREEN_SIZE, 4, - GLX_BLUE_SIZE, 4, - GLX_ALPHA_SIZE, 4, - GLX_DEPTH_SIZE, 16, - None - }; - - // stencilbuffer, 4 bits per color, 16bit zbuffer - int visualAttrDoubleStencilBuffer[] = + if (major==1 && minor>2) { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DOUBLEBUFFER, True, - GLX_RED_SIZE, 4, - GLX_GREEN_SIZE, 4, - GLX_BLUE_SIZE, 4, - GLX_ALPHA_SIZE, 4, - GLX_DEPTH_SIZE, 16, - GLX_STENCIL_SIZE, 1, - None - }; - - GLXFBConfig *configList=0; - int nitems=0; - if (StencilBuffer) - configList=glXChooseFBConfig(display, screennr, visualAttrDoubleStencilBuffer,&nitems); - if (!configList) - { + // attribute array for the draw buffer + int visualAttrBuffer[] = + { + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_RED_SIZE, 4, + GLX_GREEN_SIZE, 4, + GLX_BLUE_SIZE, 4, + GLX_ALPHA_SIZE, 4, + GLX_DEPTH_SIZE, 16, + GLX_DOUBLEBUFFER, True, + GLX_STENCIL_SIZE, 1, + None + }; + + GLXFBConfig *configList=0; + int nitems=0; if (StencilBuffer) + configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + if (!configList) { - os::Printer::log("No stencilbuffer available, disabling stencil shadows.", ELL_WARNING); - StencilBuffer = false; + if (StencilBuffer) + { + os::Printer::log("No stencilbuffer available, disabling stencil shadows.", ELL_WARNING); + StencilBuffer = false; + } + visualAttrBuffer[15]=0; + + configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + if (!configList) + { + os::Printer::log("No doublebuffering available.", ELL_WARNING); + visualAttrBuffer[13]=False; + configList=glXChooseFBConfig(display, screennr, visualAttrBuffer,&nitems); + } } - - configList=glXChooseFBConfig(display, screennr, visualAttrDoubleBuffer,&nitems); - if (!configList) + if (configList) { - os::Printer::log("No doublebuffering available.", ELL_WARNING); - configList=glXChooseFBConfig(display, screennr, visualAttrNoDoubleBuffer,&nitems); + glxFBConfig=configList[0]; + XFree(configList); + glxDrawable=true; + visual = glXGetVisualFromFBConfig(display,glxFBConfig); } } - if (configList) + else { - glxFBConfig=configList[0]; - XFree(configList); - glxDrawable=true; - visual = glXGetVisualFromFBConfig(display,glxFBConfig); + // attribute array for the draw buffer + int visualAttrBuffer[] = + { + GLX_RGBA, True, + GLX_RED_SIZE, 4, + GLX_GREEN_SIZE, 4, + GLX_BLUE_SIZE, 4, + GLX_ALPHA_SIZE, 4, + GLX_DEPTH_SIZE, 16, + GLX_DOUBLEBUFFER, True, + GLX_STENCIL_SIZE, 1, + None + }; + + if (StencilBuffer) + visual=glXChooseVisual(display, screennr, visualAttrBuffer); + if (!visual) + { + if (StencilBuffer) + { + os::Printer::log("No stencilbuffer available, disabling stencil shadows.", ELL_WARNING); + StencilBuffer = false; + } + visualAttrBuffer[15]=0; + + visual=glXChooseVisual(display, screennr, visualAttrBuffer); + if (!visual) + { + os::Printer::log("No doublebuffering available.", ELL_WARNING); + visualAttrBuffer[13]=False; + visual=glXChooseVisual(display, screennr, visualAttrBuffer); + } + } } } else @@ -381,6 +397,7 @@ XSetWMProtocols(display, window, &wmDelete, 1); XMapRaised(display, window); } + WindowActive=true; #ifdef _IRR_COMPILE_WITH_OPENGL_ @@ -390,7 +407,7 @@ { // glXCreateWindow not yet supported by hardware accelerated X11 under Linux // glxWin=glXCreateWindow(display,glxFBConfig,window,NULL); - if (true/* glxWin */) + if (true /*glxWin*/) { // create glx context Context = glXCreateNewContext(display, glxFBConfig, GLX_RGBA_TYPE, NULL, True); @@ -413,6 +430,22 @@ os::Printer::log("Could not create GLX window.", ELL_WARNING); } } + else + { + Context = glXCreateContext(display, visual, NULL, True); + if (Context) + { + if (!glXMakeCurrent(display, window, Context)) + { + os::Printer::log("Could not make context current.", ELL_WARNING); + glXDestroyContext(display, Context); + } + } + else + { + os::Printer::log("Could not create GLX rendering context.", ELL_WARNING); + } + } #endif // _IRR_COMPILE_WITH_OPENGL_ Window tmp; @@ -484,7 +517,7 @@ { irr::SEvent irrevent; - while (XPending(display) > 0 && !close) + while (XPending(display) > 0 && !Close) { XNextEvent(display, &event); @@ -503,6 +536,14 @@ } break; + case MapNotify: + WindowActive=true; + break; + + case UnmapNotify: + WindowActive=false; + break; + case MotionNotify: irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT; irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED; @@ -585,7 +626,7 @@ *wmDeleteWindow) { os::Printer::log("Quit message received.", ELL_INFORMATION); - close = true; + Close = true; } break; @@ -596,7 +637,7 @@ } // end while } - return !close; + return !Close; } @@ -757,7 +798,7 @@ //! notifies the device that it should close itself void CIrrDeviceLinux::closeDevice() { - close = true; + Close = true; } @@ -765,7 +806,7 @@ //! returns if window is active. if not, nothing need to be drawn bool CIrrDeviceLinux::isWindowActive() { - return true; // TODO + return WindowActive; } Index: source/Irrlicht/CIrrDeviceLinux.h =================================================================== --- source/Irrlicht/CIrrDeviceLinux.h (revision 122) +++ source/Irrlicht/CIrrDeviceLinux.h (working copy) @@ -228,7 +228,8 @@ int x,y; unsigned int Width, Height, Depth; - bool close; + bool Close; + bool WindowActive; struct SKeyMap {