summaryrefslogtreecommitdiff
path: root/silx/gui/utils/glutils/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/utils/glutils/__init__.py')
-rw-r--r--silx/gui/utils/glutils/__init__.py199
1 files changed, 0 insertions, 199 deletions
diff --git a/silx/gui/utils/glutils/__init__.py b/silx/gui/utils/glutils/__init__.py
deleted file mode 100644
index c90f029..0000000
--- a/silx/gui/utils/glutils/__init__.py
+++ /dev/null
@@ -1,199 +0,0 @@
-# coding: utf-8
-# /*##########################################################################
-#
-# Copyright (c) 2020-2021 European Synchrotron Radiation Facility
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# ###########################################################################*/
-"""This module provides the :func:`isOpenGLAvailable` utility function.
-"""
-
-import os
-import sys
-import subprocess
-from silx.gui import qt
-
-
-class _isOpenGLAvailableResult:
- """Store result of checking OpenGL availability.
-
- It provides a `status` boolean attribute storing the result of the check and
- an `error` string attribute storting the possible error message.
- """
-
- def __init__(self, status=True, error=''):
- self.__status = bool(status)
- self.__error = str(error)
-
- status = property(lambda self: self.__status, doc="True if OpenGL is working")
- error = property(lambda self: self.__error, doc="Error message")
-
- def __bool__(self):
- return self.status
-
- def __repr__(self):
- return '<_isOpenGLAvailableResult: %s, "%s">' % (self.status, self.error)
-
-
-def _runtimeOpenGLCheck(version):
- """Run OpenGL check in a subprocess.
-
- This is done by starting a subprocess that displays a Qt OpenGL widget.
-
- :param List[int] version:
- The minimal required OpenGL version as a 2-tuple (major, minor).
- Default: (2, 1)
- :return: An error string that is empty if no error occured
- :rtype: str
- """
- major, minor = str(version[0]), str(version[1])
- env = os.environ.copy()
- env['PYTHONPATH'] = os.pathsep.join(
- [os.path.abspath(p) for p in sys.path])
-
- try:
- error = subprocess.check_output(
- [sys.executable, '-s', '-S', __file__, major, minor],
- env=env,
- timeout=2)
- except subprocess.TimeoutExpired:
- status = False
- error = "Qt OpenGL widget hang"
- if sys.platform.startswith('linux'):
- error += ':\nIf connected remotely, GLX forwarding might be disabled.'
- except subprocess.CalledProcessError as e:
- status = False
- error = "Qt OpenGL widget error: retcode=%d, error=%s" % (e.returncode, e.output)
- else:
- status = True
- error = error.decode()
- return _isOpenGLAvailableResult(status, error)
-
-
-_runtimeCheckCache = {} # Cache runtime check results: {version: result}
-
-
-def isOpenGLAvailable(version=(2, 1), runtimeCheck=True):
- """Check if OpenGL is available through Qt and actually working.
-
- After some basic tests, this is done by starting a subprocess that
- displays a Qt OpenGL widget.
-
- :param List[int] version:
- The minimal required OpenGL version as a 2-tuple (major, minor).
- Default: (2, 1)
- :param bool runtimeCheck:
- True (default) to run the test creating a Qt OpenGL widgt in a subprocess,
- False to avoid this check.
- :return: A result object that evaluates to True if successful and
- which has a `status` boolean attribute (True if successful) and
- an `error` string attribute that is not empty if `status` is False.
- """
- error = ''
-
- if sys.platform.startswith('linux') and not os.environ.get('DISPLAY', ''):
- # On Linux and no DISPLAY available (e.g., ssh without -X)
- error = 'DISPLAY environment variable not set'
-
- else:
- # Check pyopengl availability
- try:
- import silx.gui._glutils.gl # noqa
- except ImportError:
- error = "Cannot import OpenGL wrapper: pyopengl is not installed"
- else:
- # Pre checks for Qt < 5.4
- if not hasattr(qt, 'QOpenGLWidget'):
- if not qt.HAS_OPENGL:
- error = '%s.QtOpenGL not available' % qt.BINDING
-
- elif qt.QApplication.instance() and not qt.QGLFormat.hasOpenGL():
- # qt.QGLFormat.hasOpenGL MUST be called with a QApplication created
- # so this is only checked if the QApplication is already created
- error = 'Qt reports OpenGL not available'
-
- result = _isOpenGLAvailableResult(error == '', error)
-
- if result: # No error so far, runtime check
- if version in _runtimeCheckCache: # Use cache
- result = _runtimeCheckCache[version]
- elif runtimeCheck: # Run test in subprocess
- result = _runtimeOpenGLCheck(version)
- _runtimeCheckCache[version] = result
-
- return result
-
-
-if __name__ == "__main__":
- from silx.gui._glutils import OpenGLWidget
- from silx.gui._glutils import gl
- import argparse
-
- class _TestOpenGLWidget(OpenGLWidget):
- """Widget checking that OpenGL is indeed available
-
- :param List[int] version: (major, minor) minimum OpenGL version
- """
-
- def __init__(self, version):
- super(_TestOpenGLWidget, self).__init__(
- alphaBufferSize=0,
- depthBufferSize=0,
- stencilBufferSize=0,
- version=version)
-
- def paintEvent(self, event):
- super(_TestOpenGLWidget, self).paintEvent(event)
-
- # Check once paint has been done
- app = qt.QApplication.instance()
- if not self.isValid():
- print("OpenGL widget is not valid")
- app.exit(1)
- else:
- qt.QTimer.singleShot(100, app.quit)
-
- def paintGL(self):
- gl.glClearColor(1., 0., 0., 0.)
- gl.glClear(gl.GL_COLOR_BUFFER_BIT)
-
-
- parser = argparse.ArgumentParser()
- parser.add_argument('major')
- parser.add_argument('minor')
-
- args = parser.parse_args(args=sys.argv[1:])
-
- app = qt.QApplication([])
- window = qt.QMainWindow(flags=
- qt.Qt.Popup |
- qt.Qt.FramelessWindowHint |
- qt.Qt.NoDropShadowWindowHint |
- qt.Qt.WindowStaysOnTopHint)
- window.setAttribute(qt.Qt.WA_ShowWithoutActivating)
- window.move(0, 0)
- window.resize(3, 3)
- widget = _TestOpenGLWidget(version=(args.major, args.minor))
- window.setCentralWidget(widget)
- window.setWindowOpacity(0.04)
- window.show()
-
- qt.QTimer.singleShot(1000, app.quit)
- sys.exit(app.exec_())