xref: /OK3568_Linux_fs/external/xserver/hw/dmx/examples/dmxinfo.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2001,2002 Red Hat Inc., Durham, North Carolina.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * All Rights Reserved.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining
7*4882a593Smuzhiyun  * a copy of this software and associated documentation files (the
8*4882a593Smuzhiyun  * "Software"), to deal in the Software without restriction, including
9*4882a593Smuzhiyun  * without limitation on the rights to use, copy, modify, merge,
10*4882a593Smuzhiyun  * publish, distribute, sublicense, and/or sell copies of the Software,
11*4882a593Smuzhiyun  * and to permit persons to whom the Software is furnished to do so,
12*4882a593Smuzhiyun  * subject to the following conditions:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the
15*4882a593Smuzhiyun  * next paragraph) shall be included in all copies or substantial
16*4882a593Smuzhiyun  * portions of the Software.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21*4882a593Smuzhiyun  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
22*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25*4882a593Smuzhiyun  * SOFTWARE.
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Authors:
30*4882a593Smuzhiyun  *   Rickard E. (Rik) Faith <faith@redhat.com>
31*4882a593Smuzhiyun  *
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include <stdio.h>
35*4882a593Smuzhiyun #include <stdlib.h>
36*4882a593Smuzhiyun #include <X11/Xlib.h>
37*4882a593Smuzhiyun #include <X11/extensions/dmxext.h>
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun static void
indent(int level)40*4882a593Smuzhiyun indent(int level)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun     int i;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun     for (i = 0; i < level; i++)
45*4882a593Smuzhiyun         printf("    ");
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun static void
print_window_id(const char * displayName,Display * display,Window window,int level,int child)49*4882a593Smuzhiyun print_window_id(const char *displayName, Display * display,
50*4882a593Smuzhiyun                 Window window, int level, int child)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun     char *name;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     if (!XFetchName(display, window, &name))
55*4882a593Smuzhiyun         name = NULL;
56*4882a593Smuzhiyun     indent(level);
57*4882a593Smuzhiyun     if (child)
58*4882a593Smuzhiyun         printf("(%d) ", child);
59*4882a593Smuzhiyun     printf("%s window 0x%08lx: %s%s\n",
60*4882a593Smuzhiyun            displayName,
61*4882a593Smuzhiyun            (long unsigned) window,
62*4882a593Smuzhiyun            name ? name : "", (window == DefaultRootWindow(display))
63*4882a593Smuzhiyun            ? " (DMX root window)" : "");
64*4882a593Smuzhiyun     if (name)
65*4882a593Smuzhiyun         XFree(name);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static void
print_info(Display * display,Window window,int level,int child)69*4882a593Smuzhiyun print_info(Display * display, Window window, int level, int child)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     DMXWindowAttributes winfo[128];
72*4882a593Smuzhiyun     int count;
73*4882a593Smuzhiyun     int i;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     if (!DMXGetWindowAttributes(display, window, &count, 128, winfo)) {
76*4882a593Smuzhiyun         printf("Could not get window information for 0x%08lx\n",
77*4882a593Smuzhiyun                (long unsigned) window);
78*4882a593Smuzhiyun         exit(-2);
79*4882a593Smuzhiyun     }
80*4882a593Smuzhiyun     printf("\n");
81*4882a593Smuzhiyun     print_window_id("DMX", display, window, level, child);
82*4882a593Smuzhiyun     for (i = 0; i < count; i++) {
83*4882a593Smuzhiyun         DMXScreenAttributes sinfo;
84*4882a593Smuzhiyun         Display *backend;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun         /* This could also be cached -- the information doesn't change. */
87*4882a593Smuzhiyun         if (!DMXGetScreenAttributes(display, winfo[i].screen, &sinfo)) {
88*4882a593Smuzhiyun             printf("Could not get screen information for screen %d\n", i);
89*4882a593Smuzhiyun             exit(-2);
90*4882a593Smuzhiyun         }
91*4882a593Smuzhiyun         if (!(backend = XOpenDisplay(sinfo.displayName))) {
92*4882a593Smuzhiyun             printf("Cannot open backend display %s\n", sinfo.displayName);
93*4882a593Smuzhiyun             exit(-2);
94*4882a593Smuzhiyun         }
95*4882a593Smuzhiyun         XCloseDisplay(backend);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun         indent(level + 1);
98*4882a593Smuzhiyun         printf("%s window 0x%08lx: %dx%d%+d%+d",
99*4882a593Smuzhiyun                sinfo.displayName,
100*4882a593Smuzhiyun                (long unsigned) winfo[i].window,
101*4882a593Smuzhiyun                winfo[i].pos.width, winfo[i].pos.height,
102*4882a593Smuzhiyun                winfo[i].pos.x, winfo[i].pos.y);
103*4882a593Smuzhiyun         if (!winfo[i].vis.width
104*4882a593Smuzhiyun             && !winfo[i].vis.height && !winfo[i].vis.x && !winfo[i].vis.y)
105*4882a593Smuzhiyun             printf(" not visible\n");
106*4882a593Smuzhiyun         else if (winfo[i].vis.width == winfo[i].pos.width
107*4882a593Smuzhiyun                  && winfo[i].vis.height == winfo[i].pos.height) {
108*4882a593Smuzhiyun             printf(" %+d%+d\n", winfo[i].vis.x, winfo[i].vis.y);
109*4882a593Smuzhiyun         }
110*4882a593Smuzhiyun         else {
111*4882a593Smuzhiyun             printf(" %dx%d%+d%+d\n",
112*4882a593Smuzhiyun                    winfo[i].vis.width, winfo[i].vis.height,
113*4882a593Smuzhiyun                    winfo[i].vis.x, winfo[i].vis.y);
114*4882a593Smuzhiyun         }
115*4882a593Smuzhiyun     }
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun static void
print_tree(Display * display,Window window,int level,int child)119*4882a593Smuzhiyun print_tree(Display * display, Window window, int level, int child)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun     Window root, parent;
122*4882a593Smuzhiyun     Window *list;
123*4882a593Smuzhiyun     unsigned int count;
124*4882a593Smuzhiyun     unsigned int i;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun     print_info(display, window, level, child);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun     if (!XQueryTree(display, window, &root, &parent, &list, &count)) {
129*4882a593Smuzhiyun         printf("Cannot query window tree for 0x%08lx\n",
130*4882a593Smuzhiyun                (long unsigned) window);
131*4882a593Smuzhiyun         exit(-3);
132*4882a593Smuzhiyun     }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     if (count) {
135*4882a593Smuzhiyun         indent(level + 1);
136*4882a593Smuzhiyun         printf("%d child%s:\n", count, count > 1 ? "ren" : "");
137*4882a593Smuzhiyun         for (i = 0; i < count; i++) {
138*4882a593Smuzhiyun             print_tree(display, list[i], level + 1, i + 1);
139*4882a593Smuzhiyun         }
140*4882a593Smuzhiyun     }
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun static const char *
core(DMXInputAttributes * iinfo)144*4882a593Smuzhiyun core(DMXInputAttributes * iinfo)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun     if (iinfo->isCore)
147*4882a593Smuzhiyun         return "core";
148*4882a593Smuzhiyun     else if (iinfo->sendsCore)
149*4882a593Smuzhiyun         return "extension (sends core)";
150*4882a593Smuzhiyun     else
151*4882a593Smuzhiyun         return "extension";
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun int
main(int argc,char ** argv)155*4882a593Smuzhiyun main(int argc, char **argv)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun     Display *display = NULL;
158*4882a593Smuzhiyun     Window window = 0;
159*4882a593Smuzhiyun     int event_base;
160*4882a593Smuzhiyun     int error_base;
161*4882a593Smuzhiyun     int major_version, minor_version, patch_version;
162*4882a593Smuzhiyun     DMXScreenAttributes sinfo;
163*4882a593Smuzhiyun     DMXInputAttributes iinfo;
164*4882a593Smuzhiyun     int count;
165*4882a593Smuzhiyun     int i;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     if (argc == 2 || argc == 3) {
168*4882a593Smuzhiyun         if (!(display = XOpenDisplay(argv[1]))) {
169*4882a593Smuzhiyun             printf("Cannot open display %s\n", argv[1]);
170*4882a593Smuzhiyun             return -1;
171*4882a593Smuzhiyun         }
172*4882a593Smuzhiyun         if (argc == 3)
173*4882a593Smuzhiyun             window = strtol(argv[2], NULL, 0);
174*4882a593Smuzhiyun     }
175*4882a593Smuzhiyun     else {
176*4882a593Smuzhiyun         printf("Usage: %s display [windowid]\n", argv[0]);
177*4882a593Smuzhiyun         return -1;
178*4882a593Smuzhiyun     }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     if (!display && !(display = XOpenDisplay(NULL))) {
181*4882a593Smuzhiyun         printf("Cannot open default display\n");
182*4882a593Smuzhiyun         return -1;
183*4882a593Smuzhiyun     }
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun     if (!DMXQueryExtension(display, &event_base, &error_base)) {
186*4882a593Smuzhiyun         printf("DMX extension not present\n");
187*4882a593Smuzhiyun         return -1;
188*4882a593Smuzhiyun     }
189*4882a593Smuzhiyun     printf("DMX extension present: event_base = %d, error_base = %d\n",
190*4882a593Smuzhiyun            event_base, error_base);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     if (!DMXQueryVersion(display,
193*4882a593Smuzhiyun                          &major_version, &minor_version, &patch_version)) {
194*4882a593Smuzhiyun         printf("Could not get extension version\n");
195*4882a593Smuzhiyun         return -1;
196*4882a593Smuzhiyun     }
197*4882a593Smuzhiyun     printf("Extension version: %d.%d patch %d\n",
198*4882a593Smuzhiyun            major_version, minor_version, patch_version);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun     if (!DMXGetScreenCount(display, &count)) {
201*4882a593Smuzhiyun         printf("Could not get screen count\n");
202*4882a593Smuzhiyun         return -1;
203*4882a593Smuzhiyun     }
204*4882a593Smuzhiyun     printf("Screen count = %d\n", count);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun     for (i = 0; i < count; i++) {
207*4882a593Smuzhiyun         if (!DMXGetScreenAttributes(display, i, &sinfo)) {
208*4882a593Smuzhiyun             printf("Could not get screen information for %d\n", i);
209*4882a593Smuzhiyun             return -1;
210*4882a593Smuzhiyun         }
211*4882a593Smuzhiyun         printf("%d: %s %ux%u+%d+%d %d @%dx%d (root: %dx%d%+d%+d)\n",
212*4882a593Smuzhiyun                i, sinfo.displayName,
213*4882a593Smuzhiyun                sinfo.screenWindowWidth, sinfo.screenWindowHeight,
214*4882a593Smuzhiyun                sinfo.screenWindowXoffset, sinfo.screenWindowYoffset,
215*4882a593Smuzhiyun                sinfo.logicalScreen,
216*4882a593Smuzhiyun                sinfo.rootWindowXorigin, sinfo.rootWindowYorigin,
217*4882a593Smuzhiyun                sinfo.rootWindowWidth, sinfo.rootWindowHeight,
218*4882a593Smuzhiyun                sinfo.rootWindowXoffset, sinfo.rootWindowYoffset);
219*4882a593Smuzhiyun     }
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun     if (major_version == 1 && minor_version >= 1) {
222*4882a593Smuzhiyun         if (!DMXGetInputCount(display, &count)) {
223*4882a593Smuzhiyun             printf("Could not get input count\n");
224*4882a593Smuzhiyun             return -1;
225*4882a593Smuzhiyun         }
226*4882a593Smuzhiyun         printf("Input count = %d\n", count);
227*4882a593Smuzhiyun         for (i = 0; i < count; i++) {
228*4882a593Smuzhiyun             if (!DMXGetInputAttributes(display, i, &iinfo)) {
229*4882a593Smuzhiyun                 printf("Could not get input information for id %d\n", i);
230*4882a593Smuzhiyun                 return -1;
231*4882a593Smuzhiyun             }
232*4882a593Smuzhiyun             switch (iinfo.inputType) {
233*4882a593Smuzhiyun             case DMXLocalInputType:
234*4882a593Smuzhiyun                 printf("  %2d local   %-20.20s %s\n", i, "", core(&iinfo));
235*4882a593Smuzhiyun                 break;
236*4882a593Smuzhiyun             case DMXConsoleInputType:
237*4882a593Smuzhiyun                 printf("  %2d console %-20.20s %s\n",
238*4882a593Smuzhiyun                        i, iinfo.name, core(&iinfo));
239*4882a593Smuzhiyun                 break;
240*4882a593Smuzhiyun             case DMXBackendInputType:
241*4882a593Smuzhiyun                 printf("  %2d backend %-20.20s id=%2d screen=%2d %s\n",
242*4882a593Smuzhiyun                        i, iinfo.name, iinfo.physicalId, iinfo.physicalScreen,
243*4882a593Smuzhiyun                        core(&iinfo));
244*4882a593Smuzhiyun                 break;
245*4882a593Smuzhiyun             }
246*4882a593Smuzhiyun         }
247*4882a593Smuzhiyun     }
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun     if (window)
250*4882a593Smuzhiyun         print_info(display, window, 0, 0);
251*4882a593Smuzhiyun     else
252*4882a593Smuzhiyun         print_tree(display, DefaultRootWindow(display), 0, 0);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     XCloseDisplay(display);
255*4882a593Smuzhiyun     return 0;
256*4882a593Smuzhiyun }
257