/** * Get the selected event mask for a drawable. */ PUBLIC void glXGetSelectedEvent(Display * dpy, GLXDrawable drawable, unsigned long *mask) { #ifdef GLX_USE_APPLEGL XWindowAttributes xwattr; if (apple_glx_pbuffer_get_event_mask(drawable, mask)) return; /*done */ /* * The spec allows a window, but currently there are no valid * events for a window, so do nothing, but set the mask to 0. */ if (XGetWindowAttributes(dpy, drawable, &xwattr)) { /* The window is valid, so set the mask to 0. */ *mask = 0; return; /*done */ } /* The drawable seems to be invalid. Report an error. */ __glXSendError(dpy, GLXBadDrawable, drawable, X_GLXGetDrawableAttributes, true); #else unsigned int value; /* The non-sense with value is required because on LP64 platforms * sizeof(unsigned int) != sizeof(unsigned long). On little-endian * we could just type-cast the pointer, but why? */ GetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); *mask = value; #endif }
/** * Query an attribute of a drawable. */ PUBLIC void glXQueryDrawable(Display * dpy, GLXDrawable drawable, int attribute, unsigned int *value) { WARN_ONCE_GLX_1_3(dpy, __func__); GetDrawableAttribute(dpy, drawable, attribute, value); }
/** * Get the selected event mask for a drawable. */ PUBLIC void glXGetSelectedEvent(Display *dpy, GLXDrawable drawable, unsigned long *mask) { unsigned int value; /* The non-sense with value is required because on LP64 platforms * sizeof(unsigned int) != sizeof(unsigned long). On little-endian * we could just type-cast the pointer, but why? */ GetDrawableAttribute( dpy, drawable, GLX_EVENT_MASK_SGIX, & value ); *mask = value; }
/** * Query an attribute of a drawable. */ PUBLIC void glXQueryDrawable(Display * dpy, GLXDrawable drawable, int attribute, unsigned int *value) { WARN_ONCE_GLX_1_3(dpy, __func__); #ifdef GLX_USE_APPLEGL Window root; int x, y; unsigned int width, height, bd, depth; if (apple_glx_pixmap_query(drawable, attribute, value)) return; /*done */ if (apple_glx_pbuffer_query(drawable, attribute, value)) return; /*done */ /* * The OpenGL spec states that we should report GLXBadDrawable if * the drawable is invalid, however doing so would require that we * use XSetErrorHandler(), which is known to not be thread safe. * If we use a round-trip call to validate the drawable, there could * be a race, so instead we just opt in favor of letting the * XGetGeometry request fail with a GetGeometry request X error * rather than GLXBadDrawable, in what is hoped to be a rare * case of an invalid drawable. In practice most and possibly all * X11 apps using GLX shouldn't notice a difference. */ if (XGetGeometry (dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) { switch (attribute) { case GLX_WIDTH: *value = width; break; case GLX_HEIGHT: *value = height; break; } } #else GetDrawableAttribute(dpy, drawable, attribute, value); #endif }
/** * Query an attribute of a pbuffer. */ PUBLIC int glXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX drawable, int attribute, unsigned int *value) { return GetDrawableAttribute(dpy, drawable, attribute, value); }
/** * Query an attribute of a drawable. */ PUBLIC void GLX_PREFIX(glXQueryDrawable)(Display *dpy, GLXDrawable drawable, int attribute, unsigned int *value) { GetDrawableAttribute( dpy, drawable, attribute, value ); }