212 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 | 
						|
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 "os/osdep.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 uint16_t 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;
 | 
						|
 | 
						|
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 = xallocarray(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);
 | 
						|
}
 |