diff options
Diffstat (limited to 'kcontrol/screensaver/kswidget.cpp')
-rw-r--r-- | kcontrol/screensaver/kswidget.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/kcontrol/screensaver/kswidget.cpp b/kcontrol/screensaver/kswidget.cpp new file mode 100644 index 000000000..58f28ff31 --- /dev/null +++ b/kcontrol/screensaver/kswidget.cpp @@ -0,0 +1,71 @@ +#include <config.h> + +#include <kwin.h> +#include "testwin.h" + +#ifdef HAVE_GLXCHOOSEVISUAL +#include <GL/glx.h> +#endif + +KSWidget::KSWidget( QWidget* parent, const char* name, int f ) + : QXEmbed( parent, name, f ), colormap( None ) +{ +// use visual with support for double-buffering, for opengl +// this code is duplicated in kdebase/kdesktop/lock/ +#ifdef HAVE_GLXCHOOSEVISUAL + Visual* visual = CopyFromParent; + XSetWindowAttributes attrs; + int flags = 0; + if( true /*mOpenGLVisual*/ ) + { + static int attribs[][ 15 ] = + { + #define R GLX_RED_SIZE + #define G GLX_GREEN_SIZE + #define B GLX_BLUE_SIZE + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, None } + #undef R + #undef G + #undef B + }; + for( unsigned int i = 0; + i < sizeof( attribs ) / sizeof( attribs[ 0 ] ); + ++i ) + { + if( XVisualInfo* info = glXChooseVisual( x11Display(), x11Screen(), attribs[ i ] )) + { + visual = info->visual; + colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone ); + attrs.colormap = colormap; + flags |= CWColormap; + XFree( info ); + break; + } + } + } + Window w = XCreateWindow( x11Display(), parentWidget() ? parentWidget()->winId() : RootWindow( x11Display(), x11Screen()), + x(), y(), width(), height(), 0, x11Depth(), InputOutput, visual, flags, &attrs ); + create( w ); +#endif +} + +KSWidget::~KSWidget() +{ +#ifdef HAVE_GLXCHOOSEVISUAL + if( colormap != None ) + XFreeColormap( x11Display(), colormap ); +#endif +} + +#include "kswidget.moc" |