summaryrefslogtreecommitdiffstats
path: root/kcontrol/screensaver/kswidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/screensaver/kswidget.cpp')
-rw-r--r--kcontrol/screensaver/kswidget.cpp71
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"