Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xnest / Display.c
1 /*
2
3 Copyright 1993 by Davor Matic
4
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and that
8 both that copyright notice and this permission notice appear in
9 supporting documentation. Davor Matic makes no representations about
10 the suitability of this software for any purpose. It is provided "as
11 is" without express or implied warranty.
12
13 */
14
15 #ifdef HAVE_XNEST_CONFIG_H
16 #include <xnest-config.h>
17 #endif
18
19 #include <string.h>
20 #include <errno.h>
21
22 #include <X11/X.h>
23 #include <X11/Xproto.h>
24 #include "screenint.h"
25 #include "input.h"
26 #include "misc.h"
27 #include "scrnintstr.h"
28 #include "servermd.h"
29
30 #include "Xnest.h"
31
32 #include "Display.h"
33 #include "Init.h"
34 #include "Args.h"
35
36 #include "icon"
37 #include "screensaver"
38
39 Display *xnestDisplay = NULL;
40 XVisualInfo *xnestVisuals;
41 int xnestNumVisuals;
42 int xnestDefaultVisualIndex;
43 Colormap *xnestDefaultColormaps;
44 static int xnestNumDefaultColormaps;
45 int *xnestDepths;
46 int xnestNumDepths;
47 XPixmapFormatValues *xnestPixmapFormats;
48 int xnestNumPixmapFormats;
49 Pixel xnestBlackPixel;
50 Pixel xnestWhitePixel;
51 Drawable xnestDefaultDrawables[MAXDEPTH + 1];
52 Pixmap xnestIconBitmap;
53 Pixmap xnestScreenSaverPixmap;
54 XlibGC xnestBitmapGC;
55 unsigned long xnestEventMask;
56
57 #ifdef __SUNPRO_C
58 /* prevent "Function has no return statement" error for x_io_error_handler */
59 #pragma does_not_return(exit)
60 #endif
61
62 static int _X_NORETURN
63 x_io_error_handler(Display * dpy)
64 {
65 ErrorF("Lost connection to X server: %s\n", strerror(errno));
66 CloseWellKnownConnections();
67 OsCleanup(1);
68 exit(1);
69 }
70
71 void
72 xnestOpenDisplay(int argc, char *argv[])
73 {
74 XVisualInfo vi;
75 long mask;
76 int i, j;
77
78 if (!xnestDoFullGeneration)
79 return;
80
81 XSetIOErrorHandler(x_io_error_handler);
82
83 xnestCloseDisplay();
84
85 xnestDisplay = XOpenDisplay(xnestDisplayName);
86 if (xnestDisplay == NULL)
87 FatalError("Unable to open display \"%s\".\n",
88 XDisplayName(xnestDisplayName));
89
90 if (xnestSynchronize)
91 XSynchronize(xnestDisplay, True);
92
93 mask = VisualScreenMask;
94 vi.screen = DefaultScreen(xnestDisplay);
95 xnestVisuals = XGetVisualInfo(xnestDisplay, mask, &vi, &xnestNumVisuals);
96 if (xnestNumVisuals == 0 || xnestVisuals == NULL)
97 FatalError("Unable to find any visuals.\n");
98
99 if (xnestUserDefaultClass || xnestUserDefaultDepth) {
100 xnestDefaultVisualIndex = UNDEFINED;
101 for (i = 0; i < xnestNumVisuals; i++)
102 if ((!xnestUserDefaultClass ||
103 xnestVisuals[i].class == xnestDefaultClass)
104 &&
105 (!xnestUserDefaultDepth ||
106 xnestVisuals[i].depth == xnestDefaultDepth)) {
107 xnestDefaultVisualIndex = i;
108 break;
109 }
110 if (xnestDefaultVisualIndex == UNDEFINED)
111 FatalError("Unable to find desired default visual.\n");
112 }
113 else {
114 vi.visualid = XVisualIDFromVisual(DefaultVisual(xnestDisplay,
115 DefaultScreen
116 (xnestDisplay)));
117 xnestDefaultVisualIndex = 0;
118 for (i = 0; i < xnestNumVisuals; i++)
119 if (vi.visualid == xnestVisuals[i].visualid)
120 xnestDefaultVisualIndex = i;
121 }
122
123 xnestNumDefaultColormaps = xnestNumVisuals;
124 xnestDefaultColormaps = (Colormap *) malloc(xnestNumDefaultColormaps *
125 sizeof(Colormap));
126 for (i = 0; i < xnestNumDefaultColormaps; i++)
127 xnestDefaultColormaps[i] = XCreateColormap(xnestDisplay,
128 DefaultRootWindow
129 (xnestDisplay),
130 xnestVisuals[i].visual,
131 AllocNone);
132
133 xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnestDisplay),
134 &xnestNumDepths);
135
136 xnestPixmapFormats = XListPixmapFormats(xnestDisplay,
137 &xnestNumPixmapFormats);
138
139 xnestBlackPixel = BlackPixel(xnestDisplay, DefaultScreen(xnestDisplay));
140 xnestWhitePixel = WhitePixel(xnestDisplay, DefaultScreen(xnestDisplay));
141
142 if (xnestParentWindow != (Window) 0)
143 xnestEventMask = StructureNotifyMask;
144 else
145 xnestEventMask = 0L;
146
147 for (i = 0; i <= MAXDEPTH; i++)
148 xnestDefaultDrawables[i] = None;
149
150 for (i = 0; i < xnestNumPixmapFormats; i++)
151 for (j = 0; j < xnestNumDepths; j++)
152 if (xnestPixmapFormats[i].depth == 1 ||
153 xnestPixmapFormats[i].depth == xnestDepths[j]) {
154 xnestDefaultDrawables[xnestPixmapFormats[i].depth] =
155 XCreatePixmap(xnestDisplay, DefaultRootWindow(xnestDisplay),
156 1, 1, xnestPixmapFormats[i].depth);
157 }
158
159 xnestBitmapGC = XCreateGC(xnestDisplay, xnestDefaultDrawables[1], 0L, NULL);
160
161 if (!(xnestUserGeometry & XValue))
162 xnestX = 0;
163
164 if (!(xnestUserGeometry & YValue))
165 xnestY = 0;
166
167 if (xnestParentWindow == 0) {
168 if (!(xnestUserGeometry & WidthValue))
169 xnestWidth = 3 * DisplayWidth(xnestDisplay,
170 DefaultScreen(xnestDisplay)) / 4;
171
172 if (!(xnestUserGeometry & HeightValue))
173 xnestHeight = 3 * DisplayHeight(xnestDisplay,
174 DefaultScreen(xnestDisplay)) / 4;
175 }
176
177 if (!xnestUserBorderWidth)
178 xnestBorderWidth = 1;
179
180 xnestIconBitmap =
181 XCreateBitmapFromData(xnestDisplay,
182 DefaultRootWindow(xnestDisplay),
183 (char *) icon_bits, icon_width, icon_height);
184
185 xnestScreenSaverPixmap =
186 XCreatePixmapFromBitmapData(xnestDisplay,
187 DefaultRootWindow(xnestDisplay),
188 (char *) screensaver_bits,
189 screensaver_width,
190 screensaver_height,
191 xnestWhitePixel,
192 xnestBlackPixel,
193 DefaultDepth(xnestDisplay,
194 DefaultScreen(xnestDisplay)));
195 }
196
197 void
198 xnestCloseDisplay(void)
199 {
200 if (!xnestDoFullGeneration || !xnestDisplay)
201 return;
202
203 /*
204 If xnestDoFullGeneration all x resources will be destroyed upon closing
205 the display connection. There is no need to generate extra protocol.
206 */
207
208 free(xnestDefaultColormaps);
209 XFree(xnestVisuals);
210 XFree(xnestDepths);
211 XFree(xnestPixmapFormats);
212 XCloseDisplay(xnestDisplay);
213 }