Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xnest / Display.c
CommitLineData
a09e091a
JB
1/*
2
3Copyright 1993 by Davor Matic
4
5Permission to use, copy, modify, distribute, and sell this software
6and its documentation for any purpose is hereby granted without fee,
7provided that the above copyright notice appear in all copies and that
8both that copyright notice and this permission notice appear in
9supporting documentation. Davor Matic makes no representations about
10the suitability of this software for any purpose. It is provided "as
11is" 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
39Display *xnestDisplay = NULL;
40XVisualInfo *xnestVisuals;
41int xnestNumVisuals;
42int xnestDefaultVisualIndex;
43Colormap *xnestDefaultColormaps;
44static int xnestNumDefaultColormaps;
45int *xnestDepths;
46int xnestNumDepths;
47XPixmapFormatValues *xnestPixmapFormats;
48int xnestNumPixmapFormats;
49Pixel xnestBlackPixel;
50Pixel xnestWhitePixel;
51Drawable xnestDefaultDrawables[MAXDEPTH + 1];
52Pixmap xnestIconBitmap;
53Pixmap xnestScreenSaverPixmap;
54XlibGC xnestBitmapGC;
55unsigned 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
62static int _X_NORETURN
63x_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
71void
72xnestOpenDisplay(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
197void
198xnestCloseDisplay(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}