def match(self, canvas): if not isinstance(canvas, XlibCanvas): raise RuntimeError('Canvas must be instance of XlibCanvas') x_display = canvas.display._display x_screen = canvas.display.x_screen info = glx_info.GLXInfo(x_display) have_13 = info.have_version(1, 3) if have_13: config_class = XlibCanvasConfig13 else: if 'ATI' in info.get_client_vendor(): config_class = XlibCanvasConfig10ATI else: config_class = XlibCanvasConfig10 # Construct array of attributes attrs = [] for name, value in self.get_gl_attributes(): attr = config_class.attribute_ids.get(name, None) if attr and value is not None: attrs.extend([attr, int(value)]) if have_13: attrs.extend([glx.GLX_X_RENDERABLE, True]) else: attrs.extend([glx.GLX_RGBA, True]) if len(attrs): attrs.extend([0, 0]) attrib_list = (c_int * len(attrs))(*attrs) else: attrib_list = None if have_13: elements = c_int() configs = glx.glXChooseFBConfig(x_display, x_screen, attrib_list, byref(elements)) if not configs: return [] configs = cast(configs, POINTER(glx.GLXFBConfig * elements.value)).contents result = [config_class(canvas, info, c, self) for c in configs] # Can't free array until all XlibGLConfig13's are GC'd. Too much # hassle, live with leak. XXX #xlib.XFree(configs) return result else: try: return [config_class(canvas, info, attrib_list, self)] except gl.ContextException: return []
def __init__(self, name): super(XlibDisplayDevice, self).__init__() self._display = xlib.XOpenDisplay(name) if not self._display: raise NoSuchDisplayException('Cannot connect to "%s"' % name) self.info = glx_info.GLXInfo(self._display) # Also set the default GLX display for future info queries glx_info.set_display(self._display.contents)