]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Helper methods for choosing X visual suitable for 3D visualization added
authorsan <san@opencascade.com>
Mon, 12 Apr 2010 13:39:49 +0000 (13:39 +0000)
committersan <san@opencascade.com>
Mon, 12 Apr 2010 13:39:49 +0000 (13:39 +0000)
src/Qtx/Qtx.cxx
src/Qtx/Qtx.h

index a9163e978487c2eab55445f5ada2be4839ac5580..27e9c929d8b0124e46d6fc02d69f62a341520232 100755 (executable)
@@ -39,6 +39,7 @@
 #include <QLinearGradient>
 #include <QRadialGradient>
 #include <QConicalGradient>
+#include <QtDebug>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -1381,3 +1382,70 @@ bool Qtx::stringToConicalGradient( const QString& str, QConicalGradient& gradien
   }
   return success;
 }
+
+#ifndef WIN32
+
+#include <X11/Xlib.h>
+#include <GL/glx.h>
+
+/*!
+  \brief Open the default X display and returns pointer to it.
+         This method is available on Linux only.
+  \return Pointer to X display.
+  \sa getVisual()
+*/
+void* Qtx::getDisplay()
+{
+  static Display* pDisplay = NULL;
+  if ( !pDisplay )
+    pDisplay = XOpenDisplay( NULL );
+  return pDisplay;
+}
+
+/*!
+  \brief Returns pointer to X visual suitable for 3D rendering.
+         This method is available on Linux only.
+  \return Pointer to X visual.
+  \sa getDisplay()
+*/
+Qt::HANDLE Qtx::getVisual()
+{
+  Qt::HANDLE res = NULL;
+
+  Display* pDisplay = (Display*)getDisplay();
+  if ( !pDisplay )
+    return res;
+
+  int errorBase;
+  int eventBase;
+
+  // Make sure OpenGL's GLX extension supported
+  if( !glXQueryExtension( pDisplay, &errorBase, &eventBase ) ){
+    qCritical( "Could not find glx extension" );
+    return res;
+  }
+
+  // Find an appropriate visual
+
+  int doubleBufferVisual[]  = {
+    GLX_RGBA,           // Needs to support OpenGL
+    GLX_DEPTH_SIZE, 16, // Needs to support a 16 bit depth buffer
+    GLX_DOUBLEBUFFER,   // Needs to support double-buffering
+    None                // end of list
+  };
+
+  // Try for the double-bufferd visual first
+  XVisualInfo *visualInfo = NULL;
+  visualInfo = glXChooseVisual( pDisplay, DefaultScreen(pDisplay), doubleBufferVisual );
+
+  if( visualInfo == NULL ){
+    qCritical( "Could not find matching glx visual" );
+    return res;
+  }
+
+  qDebug() << "Picked visual 0x" << hex << XVisualIDFromVisual( visualInfo->visual );
+  res = (Qt::HANDLE)( visualInfo->visual );
+  return res;
+}
+#endif // WIN32
index b5dd9f2efe77e0b5ffad1588cb3e469256be45dd..2077ea9876dc5e5ced3e0caf4fac4d7fdfa64371 100755 (executable)
@@ -167,6 +167,11 @@ public:
   static bool        stringToLinearGradient( const QString&, QLinearGradient& );
   static bool        stringToRadialGradient( const QString&, QRadialGradient& );
   static bool        stringToConicalGradient( const QString&, QConicalGradient& );
+
+#ifndef WIN32
+  static void*       getDisplay();
+  static Qt::HANDLE  getVisual();
+#endif
 };
 
 #endif