|
- //
- // "$Id: list_visuals.cxx 8033 2010-12-15 12:11:16Z AlbrechtS $"
- //
- // Visual list utility for the Fast Light Tool Kit (FLTK).
- //
- // List all the visuals on the screen, and dumps anything interesting
- // about them to stdout.
- //
- // Does not use FLTK.
- //
- // This file may be #included in another program to make a function to
- // call to list the visuals. Fl.H must be included first to indicate this.
- //
- // Copyright 1998-2010 by Bill Spitzak and others.
- //
- // This library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Library General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- // Library General Public License for more details.
- //
- // You should have received a copy of the GNU Library General Public
- // License along with this library; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- // USA.
- //
- // Please report all bugs and problems on the following page:
- //
- // http://www.fltk.org/str.php
- //
-
- #if defined(WIN32) || defined(__APPLE__)
- #include <FL/Fl.H>
- #include <FL/fl_message.H>
-
- int main(int, char**) {
- fl_alert("Currently, this program works only under X.");
- return 1;
- }
-
- #else
-
- #include <config.h>
-
- #ifndef Fl_H
-
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
- #include <X11/Xatom.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- Display *fl_display;
- int fl_screen;
- const char *dname;
- void fl_open_display() {
- fl_display = XOpenDisplay(dname);
- if (!fl_display) {
- fprintf(stderr,"Can't open display: %s\n",XDisplayName(dname));
- exit(1);
- }
- fl_screen = DefaultScreen(fl_display);
- }
-
- #endif
-
- const char *ClassNames[] = {
- "StaticGray ",
- "GrayScale ",
- "StaticColor",
- "PseudoColor",
- "TrueColor ",
- "DirectColor"
- };
-
- // SERVER_OVERLAY_VISUALS property element:
- typedef struct _OverlayInfo {
- long overlay_visual;
- long transparent_type;
- long value;
- long layer;
- } OverlayInfo;
-
- #if HAVE_MULTIBUF
- #include <X11/extensions/multibuf.h>
- #endif
-
- #if HAVE_XDBE
- #include <X11/extensions/Xdbe.h>
- #endif
-
- static void print_mask(XVisualInfo* p) {
- int n = 0;
- int what = 0;
- int print_anything = 0;
- char buf[20];
- char *q = buf;
- *q = 0;
- int b; unsigned int m; for (b=32,m=0x80000000; ; b--,m>>=1) {
- int new_what = 0;
- if (p->red_mask&m) new_what = 'r';
- else if (p->green_mask&m) new_what = 'g';
- else if (p->blue_mask&m) new_what = 'b';
- else new_what = '?';
- if (new_what != what) {
- if (what && (what != '?' || print_anything)) {
- q += sprintf(q,"%d%c", n, what);
- print_anything = 1;
- }
- what = new_what;
- n = 1;
- } else {
- n++;
- }
- if (!b) break;
- }
- printf("%7s", buf);
- }
-
- void list_visuals() {
- fl_open_display();
- XVisualInfo vTemplate;
- int num;
- XVisualInfo *visualList = XGetVisualInfo(fl_display,0,&vTemplate,&num);
-
- XPixmapFormatValues *pfvlist;
- static int numpfv;
- pfvlist = XListPixmapFormats(fl_display, &numpfv);
-
- OverlayInfo *overlayInfo = 0;
- int numoverlayinfo = 0;
- Atom overlayVisualsAtom = XInternAtom(fl_display,"SERVER_OVERLAY_VISUALS",1);
- if (overlayVisualsAtom) {
- unsigned long sizeData, bytesLeft;
- Atom actualType;
- int actualFormat;
- if (!XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen),
- overlayVisualsAtom, 0L, 10000L, False,
- overlayVisualsAtom, &actualType, &actualFormat,
- &sizeData, &bytesLeft,
- (unsigned char **) &overlayInfo))
- numoverlayinfo = int(sizeData/4);
- }
-
- #if HAVE_MULTIBUF
- int event_base, error_base;
- XmbufBufferInfo *mbuf, *sbuf;
- int nmbuf = 0, nsbuf = 0;
- if (XmbufQueryExtension(fl_display,&event_base, &error_base)) {
- XmbufGetScreenInfo(fl_display,RootWindow(fl_display,fl_screen),
- &nmbuf, &mbuf, &nsbuf, &sbuf);
- }
- #endif
-
- #if HAVE_XDBE
- int event_base, error_base;
- int numdouble = 0;
- XdbeVisualInfo *dbe = 0;
- if (XdbeQueryExtension(fl_display, &event_base, &error_base)) {
- Drawable root = RootWindow(fl_display,fl_screen);
- int numscreens = 1;
- XdbeScreenVisualInfo *a = XdbeGetVisualInfo(fl_display,&root,&numscreens);
- if (!a) printf("error getting double buffer visuals\n");
- else {
- dbe = a->visinfo;
- numdouble = a->count;
- }
- }
- #endif
-
- for (int i=0; i<num; i++) {
- XVisualInfo *p = visualList+i;
-
- XPixmapFormatValues *pfv;
- for (pfv = pfvlist; ; pfv++) {
- if (pfv >= pfvlist+numpfv) {pfv = 0; break;} // should not happen!
- if (pfv->depth == p->depth) break;
- }
-
- int j = pfv ? pfv->bits_per_pixel : 0;
- printf(" %2ld: %s %2d/%d", p->visualid, ClassNames[p->c_class],
- p->depth, j);
- if (j < 10) putchar(' ');
-
- print_mask(p);
-
- for (j=0; j<numoverlayinfo; j++) {
- OverlayInfo *o = &overlayInfo[j];
- if (o->overlay_visual == long(p->visualid)) {
- printf(" overlay(");
- if (o->transparent_type==1) printf("transparent pixel %ld, ",o->value);
- else if (o->transparent_type==2) printf("transparent mask %ld, ",o->value);
- else printf("opaque, ");
- printf("layer %ld)", o->layer);
- }
- }
-
- #if HAVE_MULTIBUF
- for (j=0; j<nmbuf; j++) {
- XmbufBufferInfo *m = &mbuf[j];
- if (m->visualid == p->visualid)
- printf(" multibuffer(%d)", m->max_buffers);
- }
- for (j=0; j<nsbuf; j++) {
- XmbufBufferInfo *m = &sbuf[j];
- if (m->visualid == p->visualid)
- printf(" stereo multibuffer(%d)", m->max_buffers);
- }
- #endif
-
- #if HAVE_XDBE
- for (j = 0; j < numdouble; j++) if (dbe[j].visual == p->visualid)
- printf(" doublebuf(perflevel %d)",dbe[j].perflevel);
- #endif
-
- if (p->visualid==XVisualIDFromVisual(DefaultVisual(fl_display,fl_screen)))
- printf(" (default visual)");
-
- putchar('\n');
- }
- }
-
- #endif
-
- #ifndef Fl_H
- int main(int argc, char **argv) {
- if (argc == 1);
- else if (argc == 2 && argv[1][0]!='-') dname = argv[1];
- else {fprintf(stderr,"usage: %s <display>\n",argv[0]); exit(1);}
- list_visuals();
- return 0;
- }
- #endif
-
- //
- // End of "$Id: list_visuals.cxx 8033 2010-12-15 12:11:16Z AlbrechtS $".
- //
|