diff options
-rw-r--r-- | progs/xdemos/glxdpyinfo.c | 1072 |
1 files changed, 0 insertions, 1072 deletions
diff --git a/progs/xdemos/glxdpyinfo.c b/progs/xdemos/glxdpyinfo.c deleted file mode 100644 index 70c806918f4..00000000000 --- a/progs/xdemos/glxdpyinfo.c +++ /dev/null @@ -1,1072 +0,0 @@ -/* - * $TOG: xdpyinfo.c /main/35 1998/02/09 13:57:05 kaleb $ - * - * xdpyinfo - print information about X display connecton - * - * -Copyright 1988, 1998 The Open Group - -All Rights Reserved. - -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 -OPEN GROUP 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. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - * - * Author: Jim Fulton, MIT X Consortium - * GLX and Overlay support added by Jamie Zawinski <[email protected]>, 11-Nov-99 - * - * To compile: - * cc -DHAVE_GLX glxdpyinfo.c -o glxdpyinfo -lGL -lX11 -lXext -lm - * - * Other defines to consider: - * -DHAVE_XIE -DHAVE_XTEST -DHAVE_XRECORD - */ - -#define HAVE_GLX /* added by Brian Paul */ - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xproto.h> /* for CARD32 */ -#include <X11/extensions/multibuf.h> -#ifdef HAVE_XIE -#include <X11/extensions/XIElib.h> -#endif /* HAVE_XIE */ -#ifdef HAVE_XTEST -#include <X11/extensions/XTest.h> -#endif /* HAVE_XTEST */ -#include <X11/extensions/sync.h> -#include <X11/extensions/Xdbe.h> -#ifdef HAVE_XRECORD -#include <X11/extensions/record.h> -#endif /* HAVE_XRECORD */ -#ifdef MITSHM -#include <X11/extensions/XShm.h> -#endif -#include <X11/Xos.h> -#include <stdio.h> -#include <stdlib.h> - -#ifdef HAVE_GLX -# include <GL/gl.h> -# include <GL/glx.h> -#endif /* HAVE_GLX */ - -#define HAVE_OVERLAY /* jwz: no compile-time deps, so do this all the time */ - -char *ProgramName; -Bool queryExtensions = False; - -static int StrCmp(a, b) - char **a, **b; -{ - return strcmp(*a, *b); -} - - -static int print_event_mask (char *buf, int lastcol, int indent, long mask); - - - -#ifdef HAVE_GLX /* Added by jwz, 11-Nov-99 */ - -static void -print_glx_versions (dpy) - Display *dpy; -{ - /* Note: with Mesa 3.0, this lies: it prints the info from the - client's GL library, rather than the info from the GLX server. - - Note also that we can't protect these calls by only doing - them when the GLX extension is present, because with Mesa, - the server doesn't have that extension (but the GL library - works anyway.) - */ - int scr = DefaultScreen (dpy); - const char *vend, *vers; - vend = glXQueryServerString (dpy, scr, GLX_VENDOR); - if (!vend) return; - vers = glXQueryServerString (dpy, scr, GLX_VERSION); - printf ("GLX vendor: %s (%s)\n", - vend, (vers ? vers : "unknown version")); -} - -static void -print_glx_visual_info (dpy, vip) - Display *dpy; - XVisualInfo *vip; -{ - int status, value = False; - - status = glXGetConfig (dpy, vip, GLX_USE_GL, &value); - if (status == GLX_NO_EXTENSION) - /* dpy does not support the GLX extension. */ - return; - - if (status == GLX_BAD_VISUAL || value == False) - { - printf (" GLX supported: no\n"); - return; - } - else - { - printf (" GLX supported: yes\n"); - } - - if (!glXGetConfig (dpy, vip, GLX_LEVEL, &value) && - value != 0) - printf (" GLX level: %d\n", value); - - if (!glXGetConfig (dpy, vip, GLX_RGBA, &value) && value) - { - int r=0, g=0, b=0, a=0; - glXGetConfig (dpy, vip, GLX_RED_SIZE, &r); - glXGetConfig (dpy, vip, GLX_GREEN_SIZE, &g); - glXGetConfig (dpy, vip, GLX_BLUE_SIZE, &b); - glXGetConfig (dpy, vip, GLX_ALPHA_SIZE, &a); - printf (" GLX type: RGBA (%2d, %2d, %2d, %2d)\n", - r, g, b, a); - - r=0, g=0, b=0, a=0; - glXGetConfig (dpy, vip, GLX_ACCUM_RED_SIZE, &r); - glXGetConfig (dpy, vip, GLX_ACCUM_GREEN_SIZE, &g); - glXGetConfig (dpy, vip, GLX_ACCUM_BLUE_SIZE, &b); - glXGetConfig (dpy, vip, GLX_ACCUM_ALPHA_SIZE, &a); - printf (" GLX accum: RGBA (%2d, %2d, %2d, %2d)\n", - r, g, b, a); - } - else - { - value = 0; - glXGetConfig (dpy, vip, GLX_BUFFER_SIZE, &value); - printf (" GLX type: indexed (%d)\n", value); - } - -# if 0 /* redundant */ - if (!glXGetConfig (dpy, vip, GLX_X_VISUAL_TYPE_EXT, &value)) - printf (" GLX class: %s\n", - (value == GLX_TRUE_COLOR_EXT ? "TrueColor" : - value == GLX_DIRECT_COLOR_EXT ? "DirectColor" : - value == GLX_PSEUDO_COLOR_EXT ? "PseudoColor" : - value == GLX_STATIC_COLOR_EXT ? "StaticColor" : - value == GLX_GRAY_SCALE_EXT ? "Grayscale" : - value == GLX_STATIC_GRAY_EXT ? "StaticGray" : "???")); -# endif - -# ifdef GLX_VISUAL_CAVEAT_EXT - if (!glXGetConfig (dpy, vip, GLX_VISUAL_CAVEAT_EXT, &value) && - value != GLX_NONE_EXT) - printf (" GLX rating: %s\n", - (value == GLX_NONE_EXT ? "none" : - value == GLX_SLOW_VISUAL_EXT ? "slow" : -# ifdef GLX_NON_CONFORMANT_EXT - value == GLX_NON_CONFORMANT_EXT ? "non-conformant" : -# endif - "???")); -# endif - - if (!glXGetConfig (dpy, vip, GLX_DOUBLEBUFFER, &value)) - printf (" GLX double-buffer: %s\n", (value ? "yes" : "no")); - - if (!glXGetConfig (dpy, vip, GLX_STEREO, &value) && - value) - printf (" GLX stereo: %s\n", (value ? "yes" : "no")); - - if (!glXGetConfig (dpy, vip, GLX_AUX_BUFFERS, &value) && - value != 0) - printf (" GLX aux buffers: %d\n", value); - - if (!glXGetConfig (dpy, vip, GLX_DEPTH_SIZE, &value)) - printf (" GLX depth size: %d\n", value); - - if (!glXGetConfig (dpy, vip, GLX_STENCIL_SIZE, &value) && - value != 0) - printf (" GLX stencil size: %d\n", value); - -# ifdef GLX_SAMPLE_BUFFERS_SGIS - if (!glXGetConfig (dpy, vip, GLX_SAMPLE_BUFFERS_SGIS, &value) && - value != 0) - { - int bufs = value; - if (!glXGetConfig (dpy, vip, GLX_SAMPLES_SGIS, &value)) - printf (" GLX multisamplers: %d (%d)\n", bufs, value); - } -# endif - - if (!glXGetConfig (dpy, vip, GLX_TRANSPARENT_TYPE_EXT, &value) && - value != GLX_NONE_EXT) - { - if (value == GLX_NONE_EXT) - printf (" GLX transparency: none\n"); - else if (value == GLX_TRANSPARENT_INDEX_EXT) - { - if (!glXGetConfig (dpy, vip, GLX_TRANSPARENT_INDEX_VALUE_EXT,&value)) - printf (" GLX transparency: indexed (%d)\n", value); - } - else if (value == GLX_TRANSPARENT_RGB_EXT) - { - int r=0, g=0, b=0, a=0; - glXGetConfig (dpy, vip, GLX_TRANSPARENT_RED_VALUE_EXT, &r); - glXGetConfig (dpy, vip, GLX_TRANSPARENT_GREEN_VALUE_EXT, &g); - glXGetConfig (dpy, vip, GLX_TRANSPARENT_BLUE_VALUE_EXT, &b); - glXGetConfig (dpy, vip, GLX_TRANSPARENT_ALPHA_VALUE_EXT, &a); - printf (" GLX transparency: RGBA (%2d, %2d, %2d, %2d)\n", - r, g, b, a); - } - } -} -#endif /* HAVE_GLX */ - - -#ifdef HAVE_OVERLAY /* Added by jwz, 11-Nov-99 */ - - /* If the server's root window contains a SERVER_OVERLAY_VISUALS property, - then that identifies the visuals which correspond to the video hardware's - overlay planes. Windows created in these kinds of visuals may have - transparent pixels that let other layers shine through. - - This might not be an X Consortium standard, but it turns out that - SGI, HP, DEC, and IBM all use this same mechanism. So that's close - enough for me. - - Documentation on the SERVER_OVERLAY_VISUALS property can be found at: - http://www.hp.com/xwindow/sharedInfo/Whitepapers/Visuals/server_overlay_visuals.html - */ - -struct overlay -{ - CARD32 visual_id; - CARD32 transparency; /* 0: none; 1: pixel; 2: mask */ - CARD32 value; /* the transparent pixel */ - CARD32 layer; /* -1: underlay; 0: normal; 1: popup; 2: overlay */ -}; - -struct overlay_list -{ - int count; - struct overlay *list; -}; - -static struct overlay_list *overlays = 0; - -static void -find_overlay_info (dpy) - Display *dpy; -{ - int screen; - Atom OVERLAY = XInternAtom (dpy, "SERVER_OVERLAY_VISUALS", False); - - overlays = (struct overlay_list *) calloc (sizeof (struct overlay_list), - ScreenCount (dpy)); - - for (screen = 0; screen < ScreenCount (dpy); screen++) - { - Window window = RootWindow (dpy, screen); - Atom actual_type; - int actual_format; - unsigned long nitems, bytes_after; - struct overlay *data = 0; - int result = XGetWindowProperty (dpy, window, OVERLAY, - 0, (65536 / sizeof (long)), False, - OVERLAY, &actual_type, &actual_format, - &nitems, &bytes_after, - (unsigned char **) &data); - if (result == Success && - actual_type == OVERLAY && - actual_format == 32 && - nitems > 0) - { - overlays[screen].count = (nitems / - (sizeof(struct overlay) / sizeof(CARD32))); - overlays[screen].list = data; - } - else if (data) - XFree((char *) data); - } -} - -static void -print_overlay_visual_info (vip) - XVisualInfo *vip; -{ - int i; - int vis = vip->visualid; - int scr = vip->screen; - if (!overlays) return; - for (i = 0; i < overlays[scr].count; i++) - if (vis == overlays[scr].list[i].visual_id) - { - struct overlay *ov = &overlays[scr].list[i]; - printf (" Overlay info: layer %ld (%s), ", - (long) ov->layer, - (ov->layer == -1 ? "underlay" : - ov->layer == 0 ? "normal" : - ov->layer == 1 ? "popup" : - ov->layer == 2 ? "overlay" : "???")); - if (ov->transparency == 1) - printf ("transparent pixel %lu\n", (unsigned long) ov->value); - else if (ov->transparency == 2) - printf ("transparent mask 0x%x\n", (unsigned) ov->value); - else - printf ("opaque\n"); - } -} -#endif /* HAVE_OVERLAY */ - - -static void -print_extension_info (dpy) - Display *dpy; -{ - int n = 0; - char **extlist = XListExtensions (dpy, &n); - - printf ("number of extensions: %d\n", n); - - if (extlist) { - register int i; - int opcode, event, error; - - qsort(extlist, n, sizeof(char *), StrCmp); - for (i = 0; i < n; i++) { - if (!queryExtensions) { - printf (" %s\n", extlist[i]); - continue; - } - XQueryExtension(dpy, extlist[i], &opcode, &event, &error); - printf (" %s (opcode: %d", extlist[i], opcode); - if (event) - printf (", base event: %d", event); - if (error) - printf (", base error: %d", error); - printf(")\n"); - } - /* do not free, Xlib can depend on contents being unaltered */ - /* XFreeExtensionList (extlist); */ - } -} - -static void -print_display_info (dpy) - Display *dpy; -{ - char dummybuf[40]; - char *cp; - int minkeycode, maxkeycode; - int i, n; - long req_size; - XPixmapFormatValues *pmf; - Window focuswin; - int focusrevert; - - printf ("name of display: %s\n", DisplayString (dpy)); - printf ("version number: %d.%d\n", - ProtocolVersion (dpy), ProtocolRevision (dpy)); - printf ("vendor string: %s\n", ServerVendor (dpy)); - printf ("vendor release number: %d\n", VendorRelease (dpy)); - -#ifdef HAVE_GLX - print_glx_versions (dpy); -#endif /* HAVE_GLX */ - - req_size = XExtendedMaxRequestSize (dpy); - if (!req_size) req_size = XMaxRequestSize (dpy); - printf ("maximum request size: %ld bytes\n", req_size * 4); - printf ("motion buffer size: %d\n", (int) XDisplayMotionBufferSize(dpy)); - - switch (BitmapBitOrder (dpy)) { - case LSBFirst: cp = "LSBFirst"; break; - case MSBFirst: cp = "MSBFirst"; break; - default: - sprintf (dummybuf, "unknown order %d", BitmapBitOrder (dpy)); - cp = dummybuf; - break; - } - printf ("bitmap unit, bit order, padding: %d, %s, %d\n", - BitmapUnit (dpy), cp, BitmapPad (dpy)); - - switch (ImageByteOrder (dpy)) { - case LSBFirst: cp = "LSBFirst"; break; - case MSBFirst: cp = "MSBFirst"; break; - default: - sprintf (dummybuf, "unknown order %d", ImageByteOrder (dpy)); - cp = dummybuf; - break; - } - printf ("image byte order: %s\n", cp); - - pmf = XListPixmapFormats (dpy, &n); - printf ("number of supported pixmap formats: %d\n", n); - if (pmf) { - printf ("supported pixmap formats:\n"); - for (i = 0; i < n; i++) { - printf (" depth %d, bits_per_pixel %d, scanline_pad %d\n", - pmf[i].depth, pmf[i].bits_per_pixel, pmf[i].scanline_pad); - } - XFree ((char *) pmf); - } - - - /* - * when we get interfaces to the PixmapFormat stuff, insert code here - */ - - XDisplayKeycodes (dpy, &minkeycode, &maxkeycode); - printf ("keycode range: minimum %d, maximum %d\n", - minkeycode, maxkeycode); - - XGetInputFocus (dpy, &focuswin, &focusrevert); - printf ("focus: "); - switch (focuswin) { - case PointerRoot: - printf ("PointerRoot\n"); - break; - case None: - printf ("None\n"); - break; - default: - printf("window 0x%lx, revert to ", focuswin); - switch (focusrevert) { - case RevertToParent: - printf ("Parent\n"); - break; - case RevertToNone: - printf ("None\n"); - break; - case RevertToPointerRoot: - printf ("PointerRoot\n"); - break; - default: /* should not happen */ - printf ("%d\n", focusrevert); - break; - } - break; - } - - print_extension_info (dpy); - - printf ("default screen number: %d\n", DefaultScreen (dpy)); - printf ("number of screens: %d\n", ScreenCount (dpy)); -} - -static void -print_visual_info (vip) - XVisualInfo *vip; -{ - char errorbuf[40]; /* for sprintfing into */ - char *class = NULL; /* for printing */ - - switch (vip->class) { - case StaticGray: class = "StaticGray"; break; - case GrayScale: class = "GrayScale"; break; - case StaticColor: class = "StaticColor"; break; - case PseudoColor: class = "PseudoColor"; break; - case TrueColor: class = "TrueColor"; break; - case DirectColor: class = "DirectColor"; break; - default: - sprintf (errorbuf, "unknown class %d", vip->class); - class = errorbuf; - break; - } - - printf (" visual:\n"); - printf (" visual id: 0x%lx\n", vip->visualid); - printf (" class: %s\n", class); - printf (" depth: %d plane%s\n", vip->depth, - vip->depth == 1 ? "" : "s"); - if (vip->class == TrueColor || vip->class == DirectColor) - printf (" available colormap entries: %d per subfield\n", - vip->colormap_size); - else - printf (" available colormap entries: %d\n", - vip->colormap_size); - printf (" red, green, blue masks: 0x%lx, 0x%lx, 0x%lx\n", - vip->red_mask, vip->green_mask, vip->blue_mask); - printf (" significant bits in color specification: %d bits\n", - vip->bits_per_rgb); -} - -static void -print_screen_info (dpy, scr) - Display *dpy; - int scr; -{ - Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */ - XVisualInfo viproto; /* fill in for getting info */ - XVisualInfo *vip; /* retured info */ - int nvi; /* number of elements returned */ - int i; /* temp variable: iterator */ - char eventbuf[80]; /* want 79 chars per line + nul */ - static char *yes = "YES", *no = "NO", *when = "WHEN MAPPED"; - double xres, yres; - int ndepths = 0, *depths = NULL; - unsigned int width, height; - - - /* - * there are 2.54 centimeters to an inch; so there are 25.4 millimeters. - * - * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch)) - * = N pixels / (M inch / 25.4) - * = N * 25.4 pixels / M inch - */ - - xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) / - ((double) DisplayWidthMM(dpy,scr))); - yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) / - ((double) DisplayHeightMM(dpy,scr))); - - printf ("\n"); - printf ("screen #%d:\n", scr); - printf (" dimensions: %dx%d pixels (%dx%d millimeters)\n", - DisplayWidth (dpy, scr), DisplayHeight (dpy, scr), - DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr)); - printf (" resolution: %dx%d dots per inch\n", - (int) (xres + 0.5), (int) (yres + 0.5)); - depths = XListDepths (dpy, scr, &ndepths); - if (!depths) ndepths = 0; - printf (" depths (%d): ", ndepths); - for (i = 0; i < ndepths; i++) { - printf ("%d", depths[i]); - if (i < ndepths - 1) { - putchar (','); - putchar (' '); - } - } - putchar ('\n'); - if (depths) XFree ((char *) depths); - printf (" root window id: 0x%lx\n", RootWindow (dpy, scr)); - printf (" depth of root window: %d plane%s\n", - DisplayPlanes (dpy, scr), - DisplayPlanes (dpy, scr) == 1 ? "" : "s"); - printf (" number of colormaps: minimum %d, maximum %d\n", - MinCmapsOfScreen(s), MaxCmapsOfScreen(s)); - printf (" default colormap: 0x%lx\n", DefaultColormap (dpy, scr)); - printf (" default number of colormap cells: %d\n", - DisplayCells (dpy, scr)); - printf (" preallocated pixels: black %ld, white %ld\n", - BlackPixel (dpy, scr), WhitePixel (dpy, scr)); - printf (" options: backing-store %s, save-unders %s\n", - (DoesBackingStore (s) == NotUseful) ? no : - ((DoesBackingStore (s) == Always) ? yes : when), - DoesSaveUnders (s) ? yes : no); - XQueryBestSize (dpy, CursorShape, RootWindow (dpy, scr), 65535, 65535, - &width, &height); - if (width == 65535 && height == 65535) - printf (" largest cursor: unlimited\n"); - else - printf (" largest cursor: %dx%d\n", width, height); - printf (" current input event mask: 0x%lx\n", EventMaskOfScreen (s)); - (void) print_event_mask (eventbuf, 79, 4, EventMaskOfScreen (s)); - - - nvi = 0; - viproto.screen = scr; - vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi); - printf (" number of visuals: %d\n", nvi); - printf (" default visual id: 0x%lx\n", - XVisualIDFromVisual (DefaultVisual (dpy, scr))); - for (i = 0; i < nvi; i++) { - print_visual_info (vip+i); -#ifdef HAVE_OVERLAY - print_overlay_visual_info (vip+i); -#endif /* HAVE_OVERLAY */ -#ifdef HAVE_GLX - print_glx_visual_info (dpy, vip+i); -#endif /* HAVE_GLX */ - } - if (vip) XFree ((char *) vip); -} - -/* - * The following routine prints out an event mask, wrapping events at nice - * boundaries. - */ - -#define MASK_NAME_WIDTH 25 - -static struct _event_table { - char *name; - long value; -} event_table[] = { - { "KeyPressMask ", KeyPressMask }, - { "KeyReleaseMask ", KeyReleaseMask }, - { "ButtonPressMask ", ButtonPressMask }, - { "ButtonReleaseMask ", ButtonReleaseMask }, - { "EnterWindowMask ", EnterWindowMask }, - { "LeaveWindowMask ", LeaveWindowMask }, - { "PointerMotionMask ", PointerMotionMask }, - { "PointerMotionHintMask ", PointerMotionHintMask }, - { "Button1MotionMask ", Button1MotionMask }, - { "Button2MotionMask ", Button2MotionMask }, - { "Button3MotionMask ", Button3MotionMask }, - { "Button4MotionMask ", Button4MotionMask }, - { "Button5MotionMask ", Button5MotionMask }, - { "ButtonMotionMask ", ButtonMotionMask }, - { "KeymapStateMask ", KeymapStateMask }, - { "ExposureMask ", ExposureMask }, - { "VisibilityChangeMask ", VisibilityChangeMask }, - { "StructureNotifyMask ", StructureNotifyMask }, - { "ResizeRedirectMask ", ResizeRedirectMask }, - { "SubstructureNotifyMask ", SubstructureNotifyMask }, - { "SubstructureRedirectMask ", SubstructureRedirectMask }, - { "FocusChangeMask ", FocusChangeMask }, - { "PropertyChangeMask ", PropertyChangeMask }, - { "ColormapChangeMask ", ColormapChangeMask }, - { "OwnerGrabButtonMask ", OwnerGrabButtonMask }, - { NULL, 0 }}; - -static int print_event_mask (char *buf, int lastcol, int indent, long mask) -{ - struct _event_table *etp; - int len; - int bitsfound = 0; - - buf[0] = buf[lastcol] = '\0'; /* just in case */ - -#define INDENT() { register int i; len = indent; \ - for (i = 0; i < indent; i++) buf[i] = ' '; } - - INDENT (); - - for (etp = event_table; etp->name; etp++) { - if (mask & etp->value) { - if (len + MASK_NAME_WIDTH > lastcol) { - puts (buf); - INDENT (); - } - strcpy (buf+len, etp->name); - len += MASK_NAME_WIDTH; - bitsfound++; - } - } - - if (bitsfound) puts (buf); - -#undef INDENT - - return (bitsfound); -} - -static void -print_standard_extension_info(dpy, extname, majorrev, minorrev) - Display *dpy; - char *extname; - int majorrev, minorrev; -{ - int opcode, event, error; - - printf("%s version %d.%d ", extname, majorrev, minorrev); - - XQueryExtension(dpy, extname, &opcode, &event, &error); - printf ("opcode: %d", opcode); - if (event) - printf (", base event: %d", event); - if (error) - printf (", base error: %d", error); - printf("\n"); -} - -static int -print_multibuf_info(dpy, extname) - Display *dpy; - char *extname; -{ - int i, j; /* temp variable: iterator */ - int nmono, nstereo; /* count */ - XmbufBufferInfo *mono_info = NULL, *stereo_info = NULL; /* arrays */ - static char *fmt = - " visual id, max buffers, depth: 0x%lx, %d, %d\n"; - int scr = 0; - int majorrev, minorrev; - - if (!XmbufGetVersion(dpy, &majorrev, &minorrev)) - return 0; - - print_standard_extension_info(dpy, extname, majorrev, minorrev); - - for (i = 0; i < ScreenCount (dpy); i++) - { - if (!XmbufGetScreenInfo (dpy, RootWindow(dpy, scr), &nmono, &mono_info, - &nstereo, &stereo_info)) { - fprintf (stderr, - "%s: unable to get multibuffer info for screen %d\n", - ProgramName, scr); - } else { - printf (" screen %d number of mono multibuffer types: %d\n", i, nmono); - for (j = 0; j < nmono; j++) { - printf (fmt, mono_info[j].visualid, mono_info[j].max_buffers, - mono_info[j].depth); - } - printf (" number of stereo multibuffer types: %d\n", nstereo); - for (j = 0; j < nstereo; j++) { - printf (fmt, stereo_info[j].visualid, - stereo_info[j].max_buffers, stereo_info[j].depth); - } - if (mono_info) XFree ((char *) mono_info); - if (stereo_info) XFree ((char *) stereo_info); - } - } - return 1; -} /* end print_multibuf_info */ - - -/* XIE stuff */ - -#ifdef HAVE_XIE - -char *subset_names[] = { NULL, "FULL", "DIS" }; -char *align_names[] = { NULL, "Alignable", "Arbitrary" }; -char *group_names[] = { /* 0 */ "Default", - /* 2 */ "ColorAlloc", - /* 4 */ "Constrain", - /* 6 */ "ConvertFromRGB", - /* 8 */ "ConvertToRGB", - /* 10 */ "Convolve", - /* 12 */ "Decode", - /* 14 */ "Dither", - /* 16 */ "Encode", - /* 18 */ "Gamut", - /* 20 */ "Geometry", - /* 22 */ "Histogram", - /* 24 */ "WhiteAdjust" - }; - -int -print_xie_info(dpy, extname) - Display *dpy; - char *extname; -{ - XieExtensionInfo *xieInfo; - int i; - int ntechs; - XieTechnique *techs; - XieTechniqueGroup prevGroup; - - if (!XieInitialize(dpy, &xieInfo )) - return 0; - - print_standard_extension_info(dpy, extname, - xieInfo->server_major_rev, xieInfo->server_minor_rev); - - printf(" service class: %s\n", subset_names[xieInfo->service_class]); - printf(" alignment: %s\n", align_names[xieInfo->alignment]); - printf(" uncnst_mantissa: %d\n", xieInfo->uncnst_mantissa); - printf(" uncnst_min_exp: %d\n", xieInfo->uncnst_min_exp); - printf(" uncnst_max_exp: %d\n", xieInfo->uncnst_max_exp); - printf(" cnst_levels:"); - for (i = 0; i < xieInfo->n_cnst_levels; i++) - printf(" %d", xieInfo->cnst_levels[i]); - printf("\n"); - - if (!XieQueryTechniques(dpy, xieValAll, &ntechs, &techs)) - return 1; - - prevGroup = -1; - - for (i = 0; i < ntechs; i++) - { - if (techs[i].group != prevGroup) - { - printf(" technique group: %s\n", group_names[techs[i].group >> 1]); - prevGroup = techs[i].group; - } - printf(" %s\tspeed: %d needs_param: %s number: %d\n", - techs[i].name, - techs[i].speed, (techs[i].needs_param ? "True " : "False"), - techs[i].number); - } - return 1; -} /* end print_xie_info */ - -#endif /* HAVE_XIE */ - - -#ifdef HAVE_XTEST -int -print_xtest_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev, foo; - - if (!XTestQueryExtension(dpy, &foo, &foo, &majorrev, &minorrev)) - return 0; - print_standard_extension_info(dpy, extname, majorrev, minorrev); - return 1; -} -#endif /* HAVE_XTEST */ - -static int -print_sync_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev; - XSyncSystemCounter *syscounters; - int ncounters, i; - - if (!XSyncInitialize(dpy, &majorrev, &minorrev)) - return 0; - print_standard_extension_info(dpy, extname, majorrev, minorrev); - - syscounters = XSyncListSystemCounters(dpy, &ncounters); - printf(" system counters: %d\n", ncounters); - for (i = 0; i < ncounters; i++) - { - printf(" %s id: 0x%08x resolution_lo: %d resolution_hi: %d\n", - syscounters[i].name, (int) syscounters[i].counter, - (int) XSyncValueLow32(syscounters[i].resolution), - (int) XSyncValueHigh32(syscounters[i].resolution)); - } - XSyncFreeSystemCounterList(syscounters); - return 1; -} - -static int -print_shape_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev; - - if (!XShapeQueryVersion(dpy, &majorrev, &minorrev)) - return 0; - print_standard_extension_info(dpy, extname, majorrev, minorrev); - return 1; -} - -#ifdef MITSHM -static int -print_mitshm_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev; - Bool sharedPixmaps; - - if (!XShmQueryVersion(dpy, &majorrev, &minorrev, &sharedPixmaps)) - return 0; - print_standard_extension_info(dpy, extname, majorrev, minorrev); - printf(" shared pixmaps: "); - if (sharedPixmaps) - { - int format = XShmPixmapFormat(dpy); - printf("yes, format: %d\n", format); - } - else - { - printf("no\n"); - } - return 1; -} -#endif /* MITSHM */ - -static int -print_dbe_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev; - XdbeScreenVisualInfo *svi; - int numscreens = 0; - int iscrn, ivis; - - if (!XdbeQueryExtension(dpy, &majorrev, &minorrev)) - return 0; - - print_standard_extension_info(dpy, extname, majorrev, minorrev); - svi = XdbeGetVisualInfo(dpy, (Drawable *)NULL, &numscreens); - for (iscrn = 0; iscrn < numscreens; iscrn++) - { - printf(" Double-buffered visuals on screen %d\n", iscrn); - for (ivis = 0; ivis < svi[iscrn].count; ivis++) - { - printf(" visual id 0x%lx depth %d perflevel %d\n", - svi[iscrn].visinfo[ivis].visual, - svi[iscrn].visinfo[ivis].depth, - svi[iscrn].visinfo[ivis].perflevel); - } - } - XdbeFreeVisualInfo(svi); - return 1; -} - -#ifdef HAVE_XRECORD -static int -print_record_info(dpy, extname) - Display *dpy; - char *extname; -{ - int majorrev, minorrev; - - if (!XRecordQueryVersion(dpy, &majorrev, &minorrev)) - return 0; - print_standard_extension_info(dpy, extname, majorrev, minorrev); - return 1; -} -#endif /* HAVE_XRECORD */ - -/* utilities to manage the list of recognized extensions */ - - -typedef int (*ExtensionPrintFunc)( -#if NeedFunctionPrototypes - Display *, char * -#endif -); - -typedef struct { - char *extname; - ExtensionPrintFunc printfunc; - Bool printit; -} ExtensionPrintInfo; - -ExtensionPrintInfo known_extensions[] = -{ -#ifdef MITSHM - {"MIT-SHM", print_mitshm_info, False}, -#endif /* MITSHM */ - {MULTIBUFFER_PROTOCOL_NAME, print_multibuf_info, False}, - {"SHAPE", print_shape_info, False}, - {SYNC_NAME, print_sync_info, False}, -#ifdef HAVE_XIE - {xieExtName, print_xie_info, False}, -#endif /* HAVE_XIE */ -#ifdef HAVE_XTEST - {XTestExtensionName, print_xtest_info, False}, -#endif /* HAVE_XTEST */ - {"DOUBLE-BUFFER", print_dbe_info, False}, -#ifdef HAVE_XRECORD - {"RECORD", print_record_info, False} -#endif /* HAVE_XRECORD */ - /* add new extensions here */ - /* wish list: PEX XKB LBX */ -}; - -int num_known_extensions = sizeof known_extensions / sizeof known_extensions[0]; - -static void -print_known_extensions(f) - FILE *f; -{ - int i; - for (i = 0; i < num_known_extensions; i++) - { - fprintf(f, "%s ", known_extensions[i].extname); - } -} - -static void -mark_extension_for_printing(extname) - char *extname; -{ - int i; - - if (strcmp(extname, "all") == 0) - { - for (i = 0; i < num_known_extensions; i++) - known_extensions[i].printit = True; - } - else - { - for (i = 0; i < num_known_extensions; i++) - { - if (strcmp(extname, known_extensions[i].extname) == 0) - { - known_extensions[i].printit = True; - return; - } - } - printf("%s extension not supported by %s\n", extname, ProgramName); - } -} - -static void -print_marked_extensions(dpy) - Display *dpy; -{ - int i; - for (i = 0; i < num_known_extensions; i++) - { - if (known_extensions[i].printit) - { - printf("\n"); - if (! (*known_extensions[i].printfunc)(dpy, - known_extensions[i].extname)) - { - printf("%s extension not supported by server\n", - known_extensions[i].extname); - } - } - } -} - -static void usage () -{ - fprintf (stderr, "usage: %s [options]\n", ProgramName); - fprintf (stderr, "-display displayname\tserver to query\n"); - fprintf (stderr, "-queryExtensions\tprint info returned by XQueryExtension\n"); - fprintf (stderr, "-ext all\t\tprint detailed info for all supported extensions\n"); - fprintf (stderr, "-ext extension-name\tprint detailed info for extension-name if one of:\n "); - print_known_extensions(stderr); - fprintf (stderr, "\n"); - exit (1); -} - -int main (argc, argv) - int argc; - char *argv[]; -{ - Display *dpy; /* X connection */ - char *displayname = NULL; /* server to contact */ - int i; /* temp variable: iterator */ - - ProgramName = argv[0]; - - for (i = 1; i < argc; i++) { - char *arg = argv[i]; - int len = strlen(arg); - - if (!strncmp("-display", arg, len)) { - if (++i >= argc) usage (); - displayname = argv[i]; - } else if (!strncmp("-queryExtensions", arg, len)) { - queryExtensions = True; - } else if (!strncmp("-ext", arg, len)) { - if (++i >= argc) usage (); - mark_extension_for_printing(argv[i]); - } else - usage (); - } - - dpy = XOpenDisplay (displayname); - if (!dpy) { - fprintf (stderr, "%s: unable to open display \"%s\".\n", - ProgramName, XDisplayName (displayname)); - exit (1); - } - -#ifdef HAVE_OVERLAY - find_overlay_info (dpy); -#endif /* HAVE_OVERLAY */ - - print_display_info (dpy); - for (i = 0; i < ScreenCount (dpy); i++) { - print_screen_info (dpy, i); - } - - print_marked_extensions(dpy); - - XCloseDisplay (dpy); - exit (0); -} |