123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- /*
- Copyright 1993 by Davor Matic
- Permission to use, copy, modify, distribute, and sell this software
- and its documentation for any purpose is hereby granted without fee,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation. Davor Matic makes no representations about
- the suitability of this software for any purpose. It is provided "as
- is" without express or implied warranty.
- */
- #ifdef HAVE_XNEST_CONFIG_H
- #include <xnest-config.h>
- #endif
- #include <string.h>
- #include <errno.h>
- #include <X11/X.h>
- #include <X11/Xproto.h>
- #include "screenint.h"
- #include "input.h"
- #include "misc.h"
- #include "scrnintstr.h"
- #include "servermd.h"
- #include "Xnest.h"
- #include "Display.h"
- #include "Init.h"
- #include "Args.h"
- #include "icon"
- #include "screensaver"
- Display *xnestDisplay = NULL;
- XVisualInfo *xnestVisuals;
- int xnestNumVisuals;
- int xnestDefaultVisualIndex;
- Colormap *xnestDefaultColormaps;
- static int xnestNumDefaultColormaps;
- int *xnestDepths;
- int xnestNumDepths;
- XPixmapFormatValues *xnestPixmapFormats;
- int xnestNumPixmapFormats;
- Pixel xnestBlackPixel;
- Pixel xnestWhitePixel;
- Drawable xnestDefaultDrawables[MAXDEPTH + 1];
- Pixmap xnestIconBitmap;
- Pixmap xnestScreenSaverPixmap;
- XlibGC xnestBitmapGC;
- unsigned long xnestEventMask;
- #ifdef __SUNPRO_C
- /* prevent "Function has no return statement" error for x_io_error_handler */
- #pragma does_not_return(exit)
- #endif
- static int _X_NORETURN
- x_io_error_handler(Display * dpy)
- {
- ErrorF("Lost connection to X server: %s\n", strerror(errno));
- CloseWellKnownConnections();
- OsCleanup(1);
- exit(1);
- }
- void
- xnestOpenDisplay(int argc, char *argv[])
- {
- XVisualInfo vi;
- long mask;
- int i, j;
- if (!xnestDoFullGeneration)
- return;
- XSetIOErrorHandler(x_io_error_handler);
- xnestCloseDisplay();
- xnestDisplay = XOpenDisplay(xnestDisplayName);
- if (xnestDisplay == NULL)
- FatalError("Unable to open display \"%s\".\n",
- XDisplayName(xnestDisplayName));
- if (xnestSynchronize)
- XSynchronize(xnestDisplay, True);
- mask = VisualScreenMask;
- vi.screen = DefaultScreen(xnestDisplay);
- xnestVisuals = XGetVisualInfo(xnestDisplay, mask, &vi, &xnestNumVisuals);
- if (xnestNumVisuals == 0 || xnestVisuals == NULL)
- FatalError("Unable to find any visuals.\n");
- if (xnestUserDefaultClass || xnestUserDefaultDepth) {
- xnestDefaultVisualIndex = UNDEFINED;
- for (i = 0; i < xnestNumVisuals; i++)
- if ((!xnestUserDefaultClass ||
- xnestVisuals[i].class == xnestDefaultClass)
- &&
- (!xnestUserDefaultDepth ||
- xnestVisuals[i].depth == xnestDefaultDepth)) {
- xnestDefaultVisualIndex = i;
- break;
- }
- if (xnestDefaultVisualIndex == UNDEFINED)
- FatalError("Unable to find desired default visual.\n");
- }
- else {
- vi.visualid = XVisualIDFromVisual(DefaultVisual(xnestDisplay,
- DefaultScreen
- (xnestDisplay)));
- xnestDefaultVisualIndex = 0;
- for (i = 0; i < xnestNumVisuals; i++)
- if (vi.visualid == xnestVisuals[i].visualid)
- xnestDefaultVisualIndex = i;
- }
- xnestNumDefaultColormaps = xnestNumVisuals;
- xnestDefaultColormaps = (Colormap *) malloc(xnestNumDefaultColormaps *
- sizeof(Colormap));
- for (i = 0; i < xnestNumDefaultColormaps; i++)
- xnestDefaultColormaps[i] = XCreateColormap(xnestDisplay,
- DefaultRootWindow
- (xnestDisplay),
- xnestVisuals[i].visual,
- AllocNone);
- xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnestDisplay),
- &xnestNumDepths);
- xnestPixmapFormats = XListPixmapFormats(xnestDisplay,
- &xnestNumPixmapFormats);
- xnestBlackPixel = BlackPixel(xnestDisplay, DefaultScreen(xnestDisplay));
- xnestWhitePixel = WhitePixel(xnestDisplay, DefaultScreen(xnestDisplay));
- if (xnestParentWindow != (Window) 0)
- xnestEventMask = StructureNotifyMask;
- else
- xnestEventMask = 0L;
- for (i = 0; i <= MAXDEPTH; i++)
- xnestDefaultDrawables[i] = None;
- for (i = 0; i < xnestNumPixmapFormats; i++)
- for (j = 0; j < xnestNumDepths; j++)
- if (xnestPixmapFormats[i].depth == 1 ||
- xnestPixmapFormats[i].depth == xnestDepths[j]) {
- xnestDefaultDrawables[xnestPixmapFormats[i].depth] =
- XCreatePixmap(xnestDisplay, DefaultRootWindow(xnestDisplay),
- 1, 1, xnestPixmapFormats[i].depth);
- }
- xnestBitmapGC = XCreateGC(xnestDisplay, xnestDefaultDrawables[1], 0L, NULL);
- if (!(xnestUserGeometry & XValue))
- xnestX = 0;
- if (!(xnestUserGeometry & YValue))
- xnestY = 0;
- if (xnestParentWindow == 0) {
- if (!(xnestUserGeometry & WidthValue))
- xnestWidth = 3 * DisplayWidth(xnestDisplay,
- DefaultScreen(xnestDisplay)) / 4;
- if (!(xnestUserGeometry & HeightValue))
- xnestHeight = 3 * DisplayHeight(xnestDisplay,
- DefaultScreen(xnestDisplay)) / 4;
- }
- if (!xnestUserBorderWidth)
- xnestBorderWidth = 1;
- xnestIconBitmap =
- XCreateBitmapFromData(xnestDisplay,
- DefaultRootWindow(xnestDisplay),
- (char *) icon_bits, icon_width, icon_height);
- xnestScreenSaverPixmap =
- XCreatePixmapFromBitmapData(xnestDisplay,
- DefaultRootWindow(xnestDisplay),
- (char *) screensaver_bits,
- screensaver_width,
- screensaver_height,
- xnestWhitePixel,
- xnestBlackPixel,
- DefaultDepth(xnestDisplay,
- DefaultScreen(xnestDisplay)));
- }
- void
- xnestCloseDisplay(void)
- {
- if (!xnestDoFullGeneration || !xnestDisplay)
- return;
- /*
- If xnestDoFullGeneration all x resources will be destroyed upon closing
- the display connection. There is no need to generate extra protocol.
- */
- free(xnestDefaultColormaps);
- XFree(xnestVisuals);
- XFree(xnestDepths);
- XFree(xnestPixmapFormats);
- XCloseDisplay(xnestDisplay);
- }
|